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


超概要

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]));