16
14

More than 5 years have passed since last update.

[paiza]C#のテストを楽に行う方法

Last updated at Posted at 2015-12-12

超概要

Conditional属性と、Console.SetInを利用してテスト環境を作る。

解決したい問題

paizaの回答を送信する前にローカルで動作テストを行いたい。

が、テストを行うたびにサンプルの入力値をコンソールに打ち込むのは面倒。手入力はしたくないし、サンプルコードが複数あるとコピペも面倒。楽したい。

というわけで、サンプルの入力値をファイルから読み込むようにしてみました。
提出時とテスト時でコードを書き換えないで済むので「んほぉデバッグコード消し忘れたのぉおおおおお」という事故を減らすことができます。

開発環境

一部IDEの機能を使うので、開発環境を記します。
適当にいじれば、ほとんどの環境で同等の環境を構築できるはずです。

・Microsoft Visual Studio Community 2015

いじょ。

環境構築手順

  1. プロジェクトにテキストファイルを追加する(sampleInput.txtとする)
    • プロジェクトを右クリック > 追加 > 新しい項目 > テキストファイル
  2. 追加したテキストファイルのプロパティを編集する
    • 「出力ディレクトリにコピー」の値を「常にコピーする」or「新しい場合はコピーする」にする
  3. ビルド設定の「条件付きコンパイルシンボル」に「LOCAL_DEBUG」を追加する
    • プロジェクトを右クリック > プロパティ > ビルドタブ > 全般

sampleInput.txtには、paizaで公開されているサンプル入力値をコピペしておいてください。

んで、次のようなコードを利用することで、ローカルで実行するときは入力をファイルから受け取り、提出時は普通に?入力値を受け取ることができます。提出時にコードを書き換えないで済むのがオシャレ。

namespace PaizaChallenge
{
  class Program
  {
    static void Main()
    {
      ChangeLocalDebugInput();

      // your code
      // ...
    }

    [System.Diagnostics.Conditional("LOCAL_DEBUG")]
    static void ChangeLocalDebugInput()
    {
      Console.SetIn(new System.IO.StreamReader("sampleInput.txt"));
    }
  }
}

サンプル入力セットが複数ある場合でも、ファイルを追加するだけでサクッとテストすることができます。

以上です。快適なpaizaライフを。

参考

17.4.2 Conditional 属性 (C#)
https://msdn.microsoft.com/ja-jp/library/aa664622(v=vs.71).aspx

Console.SetIn メソッド (TextReader) (System)
https://msdn.microsoft.com/ja-jp/library/system.console.setin(v=vs.110).aspx

【C#】paizaの煩わしいテスト(入力処理)を自動化したい | Black Everyday Company
http://kuroeveryday.blogspot.jp/2014/11/paiza-TDD.html

疑問

入力に使ったStreamReaderはDisposeしなくても良いのでしょうか?

MSDNのサンプルコードを見てみると、特に開放処理はしていないようなのですが。。。

Console.SetIn メソッド (TextReader) (System)
https://msdn.microsoft.com/ja-jp/library/system.console.setin(v=vs.110).aspx

Console.SetIn(new StreamReader(args[0]));
16
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
14