永遠のビギナーのブログ -14ページ目

vs2010 単体テスト作成顛末記

タイトル通り、VS2010でC#の単体テストを組み込もうとしたのだが、余りにもMSのマニュアル通りに動作しなかったので備忘録としてこれを記す。


まずはテストプロジェクトの作成であるが、これはうまくいった。テスト対象のコード部分で右クリックをして「テストを作成する」で作成した。


で、とりあえずコンパイルしてみるのだがうまく動作しない。なにやら.NETのバージョンが違うらしい。プロジェクトのプロパティを見てみると、テスト対象は[.NET Framework Client...]でテストプロジェクトは[.NET Framework 4]自動作成なんだから合わせれば良いのに、と思ったがテストプロジェクトの方は変更できない。仕方がないので(本末転倒だが)テスト対象の方を合わせる。あとはプラットホームターゲットも合わせる。これも対象側が[AnyCPU]なのに対してテストプロジェクトは選択できないので[x86]に一致させた。


それでもコンパイルできないのだがなにやらdllが無いとか言っている。テスト対象のプロジェクトに付随するリソースのみのプロジェクトが自動作成されているのだが、そこにdllがないのは当たり前だろう。リソースしかないんだから。などと言っても仕方がないのでテストプロジェクトの参照から不要な参照を外す。再度実行するとまた勝手に自動参照しやがった。そこでテスト対象のプロジェクトからリソースのみのプロジェクトへの参照を外す。テストをするために対象側をいろいろ弄る必要があるのは本末転倒であり、できがよくない証拠である。


とりあえずコンパイルができたのでテストを行う。なにやら結果が表示できないとか言われる。よく調べてみると自動作成されるテストの末に必ずある"Assert.Inconclusive"が原因と分かる。なぜこの文が必ず挿入されるのかは判然としないが説明にあるセキュリティ関連であろうか。要するにテストが確実に呼び出されていることの確認である。


それはさておき、一つのデータでテストの動作確認が取れたのでテストデータの作成に移る。データはデータベースに格納するかローカルのファイルか選択できる。ファイルもcsvかxmlのどちらかが選べるようだ。汎用性と簡易性でcsvを選ぶべきだがTFSもあるし、サーバーにSQLServerが入っているのだからデータベースを使ってみるかと思う。接続できない。Windows認証にはユーザ名とパスワードを入れる欄がないからAD構築してないと入れないのだろう。なんか半端な気がする。SQLServerで入るにはサーバーのOSのIDではダメなのだろうか?多分SQLServerのID作成がいるのだろう。作れば良いのだが面倒なので簡易性を選択してCSVファイルを作成する。


エクセルでCSVファイルを作成してデータ接続するもなぜかデータがプレビューされない。いろいろ試行錯誤したあげくVS2010を再起動してみる。今度は認識された。これで無事データファイルが認識できたようだ。


さてコードをテストデータ使用に変更する。なぜか「TestContext.DataRowに[]を付加することはできない」というエラーをintelisenseに言われる。マニュアルにもマニュアルサンプルでも配列表記になっているのに不可思議な事態だ。見ているマニュアルのバージョン違いかと思いいろいろ見て見るもそのような表記は見当たらない。仕方がないので英語でググると同じ症状の人が見つかる。2つの回答のうち一方のみ評価されているがもう一方の方がシンプルな解決方法だ。こちらでは解決しないのだろうか?と疑問に思いながらも簡潔な方を実行してみる。解決した。具体的にはテストプロジェクトの参照設定にSystem.Dataを追加しただけなのだが。本来自動で追加されるべきものが落ちていたのだろうと推測する。


これでデータテストが可能になる。実行させて失敗箇所を見る。予定通りの箇所が失敗している(原則としてテストはまず一つは失敗させるべきだ。最初の無条件の成功は思考停止の引き金になる)。ソリューションエクスプローラーに表示されているエクセルファイルをダブルクリックで呼び出して変更する。なぜか変更がテストに反映されない。念のためローカルファイルを見てみると変更は反映されていない。試しにローカルファイルを変更するとテストに反映される。これは変だろう。


1.ソリューションから変更してもテストに反映されない。

2.ローカルファイルを変更するとテストに反映されるがソリューションの側に反映されない。


この2点から考えるとソリューション上のファイルは幻みたいなもので意味が判然としない。別端末でのテストが行えるだろうからおそらくファイルはTFSサーバー上に存在するのだろうが、いったいどのタイミングでデータが反映されるのか判然としない。データ結合した瞬間だろうか?ためしにテストデータだけをチェックアウト後弄ってチェックインしてみたら無効なチェックインと言われて拒絶された。つまりテストデータを管理する事はできていないようだ。MSのテストドリブンは口だけで少なくともこのときは自分たちではやっていないのだろう。要するにコードとテストデータの管理は個別にやるしかないと言うことだ。


まとめ

1)テストデータはTFS2010では管理されない。コードとは別に管理する必要がある。

2)MSの自動設定は(例のごとく)それほど信用できない。壊滅的とまでは行かないがスグに逐一自分で確認する必要がある。

3)今回の修正事項は以下の通り。


・プロジェクトの.NET Frameworkのバージョンを合わせる必要がある。

・プロジェクトのターゲットCPUを合わせる必要がある。

・テスト側では参照する必要の無いプロジェクトでも問答無用で参照するので本末転倒だがターゲット側で参照を外す(あとで戻す必要あり)。

・テストデータがプレビューできない場合はVS2010を再起動。

・TestContext.DataRow[]が使えない時はテストプロジェクトの参照設定にSystem.Dataを追加する。


4)テストデータ管理用にチームエクスプローラーで[ドキュメント]-[サンプルとテンプレート]-[テスト]以下にテストデータをアップロードした。

データ通信量の異常な増加 その後2

以前の記事の続き。さて、勝手に同期していることが分かったので今度はその条件を観察してみることにした。

具体的には思いついた時に確認をしてその状況をメールでメモに残すことにした。たとえばこんな感じ。

某月某日6:40
勝手に同期している。当然、onになっている。

某月某日7:25
onになっている。どうも毎朝勝手に自動同期がonになるようだ。

こうして観察を続けた結果、どうも毎朝五時に自動同期が設定されていると分かる。要するにcron系の何かが動いているらしい。調べてみると"Android.app.AlarmManager"なるものがあって、これがcron的に使えるもののようだ。実際に自動同期するアプリがこれを使用しているかどうかはまだ不明だがこれの設定を弄れば解決するように思える。

あとはターミナルでrootとって、設定箇所を調べて弄れば良いのだがちょっと忙しいのでパス。時間を見て解決するようにする。

また観察している途中に同期関連の奇妙な挙動も発見したのだが、再現性がないので放置している。おそらくは長期間リセットをかけないと発現するOS側のバグに見えるのだが、詳細は不明。

今年を振り返って

さて、今年も終わろうとしています。通信データ増大の話はその後自分で調査した結果があって少し分かったこともあるのですが、時間の関係で今年はこれで閉めようと思います。続きは年明けにでも出来たらと考えていますが、そのときに阿鼻叫喚の絵図になっていなければ良いのですが。

今年の記事は5月から書き始めました。最初の記事はSSDからSSDへの換装についてでした。その後HTC Butterflyの購入感想や電池持ちなどについて書きました。

6月には民度の話、7月は「人生は金だ」という言葉の別の(自分なりの)解釈について述べました。11月にはセンター試験の改変(改悪?)について述べました。適宜正しい測定を行うことは慎重を期していても難しいことではあります。

最後の方で書いた「特定のアプリに起因する」と思われるデータ通信量の増加は、年末に海外に旅行される方に異常な料金を発生させるかもしれません。それがもたらす混乱は年末年始の料金が判明する来年1月半ば以降になるでしょう。

皆様におかれましては無事年を越して良き年始を迎えられますよう祈念しております。