我目前组织单元测试的方式归结为以下几点:
- 每个项目都有自己的带有单元测试的专用项目。对于一个项目
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()
{
// ...
}
}
这种方法对我很有帮助,因为它使定位某些代码的测试变得非常简单。在相反的站点上,它使代码重构变得比它应该的更加困难:
- 当我决定将一个项目拆分为多个较小的项目时,我还需要拆分我的测试项目。
- 当我想更改一个类的命名空间时,我必须记住也要更改一个测试类的命名空间(和文件夹结构)。
- 当我更改方法的名称时,我必须通过所有测试并在那里更改名称。当然,我可以使用搜索和替换,但这不是很可靠。最后,我仍然需要手动检查更改。
是否有一些巧妙的方法来组织单元测试,仍然可以让我快速定位特定代码的测试,同时更适合重构?
或者,是否有一些,呃,也许是 Visual Studio 扩展,可以让我以某种方式说“嘿,这些测试是针对那个方法的,所以当方法的名称发生变化时,请善待并改变测试” ? 老实说,我正在认真考虑自己写这样的东西:)