gpt4 book ai didi

c# - 如何组织单元测试而不让重构成为噩梦?

转载 作者:可可西里 更新时间:2023-11-01 08:27:35 25 4
gpt4 key购买 nike

我目前组织单元测试的方式归结为以下几点:

  • 每个项目都有自己的单元测试专用项目。对于项目BusinessLayer,有一个BusinessLayer.UnitTests测试项目。
  • 对于我要测试的每个类,测试项目中都有一个单独的测试类,位于与被测类完全相同的文件夹结构和完全相同的命名空间中。对于来自命名空间 BusinessLayer.Repositories 的类 CustomerRepository,在命名空间 BusinessLayerUnitTests.Repositories 中有一个测试类 CustomerRepositoryTests >.

每个测试类中的方法都遵循简单的命名约定 MethodName_Condition_ExpectedOutcome。因此,类 CustomerRepositoryTests 包含类 CustomerRepository 的测试,其中定义了 Get 方法,如下所示:

[TestFixture]
public class CustomerRepositoryTests
{
[Test]
public void Get_WhenX_ThenRecordIsReturned()
{
// ...
}

[Test]
public void Get_WhenY_ThenExceptionIsThrown()
{
// ...
}
}

这种方法对我很有用,因为它使定位某些代码段的测试变得非常简单。在对面的网站上,它使代码重构变得更加困难,而不是应该的:

  • 当我决定将一个项目拆分成多个较小的项目时,我也需要拆分我的测试项目。
  • 当我想更改类的命名空间时,我必须记住也要更改测试类的命名空间(和文件夹结构)。
  • 当我更改方法的名称时,我必须通过所有测试并更改那里的名称。当然,我可以使用搜索和替换,但这不是很可靠。最后,我还是需要手动检查更改。

是否有一些聪明的方法来组织单元测试,让我可以快速定位特定代码的测试并且同时更有助于重构?

或者,是否有一些,呃,也许是 Visual Studio 扩展,可以让我以某种方式说“嘿,这些测试是针对那个方法的,所以当方法的名称改变了,请善待并改变测试”?老实说,我正在认真考虑自己写这样的东西:)

最佳答案

经过大量测试后,我开始意识到(至少对我而言)所有这些限制从长远来看会带来很多问题,而不是好事。因此,我们不再使用“名称”和约定来确定这一点,而是开始使用代码。每个项目和每个类都可以有任意数量的测试项目和测试类。所有测试代码都是根据从功能角度测试的内容(或者它实现的需求,或者它重现的错误等)来组织的。然后为了找到一段代码的测试,我们这样做:

[TestFixture]
public class MyFunctionalityTests
{
public IEnumerable<Type> TestedClasses()
{
// We can find the tests for a class, because the test cases references in some special method.
return new []{typeof(SomeTestedType), typeof(OtherTestedType)};
}

[Test]
public void TestRequirement23423432()
{
// ... test code.
this.TestingMethod(someObject.methodBeingTested); //We do something similar for methods if we want to track which methods are being tested (we usually don't)
// ...
}
}

我们可以使用像 resharper“usages”这样的工具来查找测试用例等...当这还不够时,我们通过加载所有测试类并运行类似 的反射和 LINQ 来施展魔法allTestClasses.where(testClass => testClass.TestedClasses().FindSomeTestClasses());您还可以使用 TearDown 收集有关每个方法/类测试了哪些方法的信息,并执行相同的操作。

关于c# - 如何组织单元测试而不让重构成为噩梦?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11585150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com