久しぶりに C# での開発現場に戻ってからテストコードを書く時にやっていること

久しぶりに C# の現場になる

といっても、2018 年の 2 月から徐々になので、そろそろ 戻ってから 1 年経つというところです。

それまでは Ruby メインの開発現場に 4 年と少しいて、その前は C# をずっと書いていたので久しぶりという感じです。

Ruby から戻って困ったこと

Ruby というよりは Ruby on Rails の現場に長く居たということと、C# に戻って担当したアプリが長年運用されていたもので、それこそテストコードすら存在しないものだったいうのが大きいと思います。

で、何に困ったかというと、、、テストです。

その前にディスクレイマー

  • 筆者は C# でのテストの経験がそれまであまりない。NUnit で簡単なテストを書いていたぐらい。
  • 筆者は Ruby on Rails での現場に長くいて、そのやり方に慣れている
  • 筆者は最近の C# でのテストの書き方に精通しておらず、その状態でプロジェクトに望む必要があった

ということで、以降の内容は Ruby on Rails の現場に居た人間が C# でも Rails みたいにテストコードを書きたいという、ちょっとしたワガママの一つぐらいに思ってもらえればと思います。これが正解だとは微塵も思っていないです。

テストをどう書く?

私が居た Ruby on Rails の現場は、テストに関しては RSpec, Factory Girl を利用しつつ、Model spec, Request spec, Feature spec をまんべんなく書くという感じでした。 Fixture はそれほど使わず、Controller spec もあまり使わないという感じです。

一方で、担当した C# のアプリケーションは 5 年以上前に片手間で書かれたようなもので、それにも関わらず重要なデータの削除を担当していたりして、、とよくある話ですよね。

にも関わらず、結構大規模な修正をしなければならなくなったので、「とりあえず既存機能のリグレッション」のテストを書かなければという気持ちになったのですが、 Rails の現場でやっていたようなテストを書ける環境がさくっとは整わなかったというのが発端です。

具体的には以下のようなものです。

  • テストのセッションごとに隔離された RDB の環境が無い!
  • テストデータを作るための Factory も Fixture も無い!
  • WebMock が無い!
  • DatabaseCleaner が無い!
  • RSpec のように階層のあるテストをどうやって書けばいいのか分からない。。

おそらく現場によってテストの書き方は様々で、特に C# は DI Container もよく使われているようなので Mock を多用する事が多いというのもあるかもしれません。 今回に関しては、古いアプリケーションということもあり、できるだけ End to End (コンソールアプリなので End to End という呼び方でいいのかは分かりませんが)でのテストを書きたいというのもあり、上記のようなテスト環境を揃えたかったというのがあります。

どのように書いていったか

以下ではとりあえず、何を使って対応したかぐらいを書いています。細かいことは別の記事にしていこうと思います。

  • テストのセッションごとに隔離された RDB の環境が無い!
    • Docker Compose を使って共通した CI 用の DB インスタンスを使わずに、テスト毎に RDB の環境を作る
    • これは C# 関係ないですね。
  • テストデータを作るための Factory も Fixture も無い!
    • EF Core を使って、テスト対象の RDB から Entity の class を自動生成
    • Bogus を使って Factory を定義
  • WebMock が無い!
  • DatabaseCleaner が無い!
  • RSpec のように階層のあるテストをどうやって書けばいいのか分からない。。