単体テストを整理する私の現在の方法は、次のようになります。
- 各プロジェクトには、単体テストを含む専用のプロジェクトがあります。プロジェクト
BusinessLayer
には、BusinessLayer.UnitTests
テスト プロジェクトがあります。 - テストするクラスごとに、テスト対象のクラスとまったく同じフォルダー構造内およびまったく同じ名前空間に配置されたテスト プロジェクトに個別のテスト クラスがあります。
CustomerRepository
名前空間のクラスの場合、名前空間BusinessLayer.Repositories
にテスト クラスCustomerRepositoryTests
がありますBusinessLayerUnitTests.Repositories
。
各テスト クラス内のメソッドは、単純な命名規則に従いますMethodName_Condition_ExpectedOutcome
。したがって、メソッドが定義さCustomerRepositoryTests
れたクラスのテストを含むクラスは、次のようになります。CustomerRepository
Get
[TestFixture]
public class CustomerRepositoryTests
{
[Test]
public void Get_WhenX_ThenRecordIsReturned()
{
// ...
}
[Test]
public void Get_WhenY_ThenExceptionIsThrown()
{
// ...
}
}
このアプローチは、コードの一部のテストを非常に簡単に見つけることができるため、非常に役に立ちました。反対側のサイトでは、コードのリファクタリングが非常に難しくなります。
- 1 つのプロジェクトを複数の小さなプロジェクトに分割する場合は、テスト プロジェクトも分割する必要があります。
- クラスの名前空間を変更したい場合は、テスト クラスの名前空間 (およびフォルダー構造) も変更することを忘れないでください。
- メソッドの名前を変更するときは、すべてのテストを実行して、そこでも名前を変更する必要があります。確かに、検索と置換を使用できますが、これはあまり信頼できません。結局、手動で変更を確認する必要があります。
特定のコードのテストをすばやく見つけられると同時に、リファクタリングにより適した、単体テストを整理する巧妙な方法はありますか?
あるいは、おそらく Visual Studio の拡張機能で、「ねえ、これらのテストはそのメソッド用なので、メソッドの名前が変更されたときは、親切にしてテストも変更してください」と言うことができますか? ? 正直なところ、私は自分でそのようなものを書くことを真剣に考えています:)