超概要
Conditional属性と、Console.SetInを利用してテスト環境を作る。
解決したい問題
paizaの回答を送信する前にローカルで動作テストを行いたい。
が、テストを行うたびにサンプルの入力値をコンソールに打ち込むのは面倒。手入力はしたくないし、サンプルコードが複数あるとコピペも面倒。楽したい。
というわけで、サンプルの入力値をファイルから読み込むようにしてみました。
提出時とテスト時でコードを書き換えないで済むので「んほぉデバッグコード消し忘れたのぉおおおおお」という事故を減らすことができます。
開発環境
一部IDEの機能を使うので、開発環境を記します。
適当にいじれば、ほとんどの環境で同等の環境を構築できるはずです。
・Microsoft Visual Studio Community 2015
いじょ。
環境構築手順
- プロジェクトにテキストファイルを追加する(sampleInput.txtとする)
- プロジェクトを右クリック > 追加 > 新しい項目 > テキストファイル
- 追加したテキストファイルのプロパティを編集する
- 「出力ディレクトリにコピー」の値を「常にコピーする」or「新しい場合はコピーする」にする
- ビルド設定の「条件付きコンパイルシンボル」に「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]));