2012-07-20 97 views
12

我的组织单元测试的电流的方式归结为以下几点:如何组织单元测试并不重构恶梦?

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

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

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

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

这种做法一直担任我非常好,因为它使一些一段代码非常简单的定位测试。在对面的网站,它使代码重构真的更难,那么它应该是:

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

有没有组织单元测试将仍然允许我在同一时间快速定位测试特定的代码更借本身对重构的一些巧妙的方式?

另外,有一些,嗯,也许Visual Studio的扩展,这将让我莫名其妙地说:“嘿,这些测试是方法,所以当的方法改变名称,请如此种类和改变测试以及“?说实话,我认真考虑自己写这样的东西:)

+0

你如何命名您的测试方法?它们是否包含您正在测试的方法的名称? – 2012-07-20 18:46:13

+0

@UfukHacıoğulları是的,他们这样做。在这个问题中,我提到了这些名字遵循的确切约定。 – 2012-07-20 18:49:15

回答

4

工作了很多与测试后,我认识到,(至少对我来说),具有所有这些限制带来了很多的问题,从长远来看,而不是好东西。因此,不是使用“名称”和约定来确定,我们已经开始使用代码。每个项目和每个类都可以有任意数量的测试项目和测试类。所有的测试代码都是基于从功能角度测试的内容(或者它实现的要求,或者它复制的错误等)来组织的。然后寻找测试了一段代码,我们这样做:

[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的“惯例”中找到测试用例,等等......而当这还不够,我们做了一些魔法通过反射和LINQ通过加载所有的测试类,并运行像allTestClasses.where(testClass => testClass.TestedClasses().FindSomeTestClasses()); 您还可以使用的删除收集有关哪些方法是通过每个方法/类测试,并做了相同的信息。

+0

感谢您为我提供一些有关方法跟踪的有趣想法。我不确定是否要放弃所有的约定 - 我可能会尝试开发一些能够自动将测试项目与“真实”对应项目同步的工具。 – 2012-07-21 14:47:46

+0

这就像一个测试数据库!我喜欢! – 2012-11-19 08:45:36

0

每个项目的一个单元测试项目是要走的路。我们已经尝试了一个巨型单元测试项目,但是这增加了编译时间。

为了帮助您重构使用类似resharpercode rush的产品。

+0

是的,我已经在使用ReSharper的,但是重命名方法时,它有助于只有部分。它试图在它认为使用该方法的解决方案中找到位置,但仍有许多误报,特别是对于常用方法名称。我正在寻找更自动,更省时的东西。 – 2012-07-20 18:56:46

+0

Resharper和VS可以帮助您重命名命名空间,请参阅:http://stackoverflow.com/questions/3360320/refactor-namespace-in-visual-studio – 2012-07-20 19:02:49

+0

没错。但就我而言,它只会重命名一个名称空间。 'CustomerRepository'而不是'CustomerRepositoryTests',这正是我所追求的。 – 2012-07-20 19:05:28

0

有没有组织单元测试仍然 让我找到测试特定的代码快速

ReSharper的一些巧妙的方法有一些很好的捷径,使您可以搜索文件或代码

至于你说的类CustomerRepository在你情况下,它们是一个测试CustomerRepositoryTests

R·快捷键显示inpput框,您可以找到你可以只输入CRT,它会小号怎么你们都开始使用命名文件必须先为资本C,则R和则T

它还允许你用通配符如CR *将显示您的文件CustomerRepository列表和CustomerRepositoryTests

+0

感谢您的建议。但是,我真的不明白它如何帮助我解决我的问题。你引用的句子会继续*,同时为重构提供更多的帮助* - 这就是我需要解决的问题:) – 2012-07-20 19:02:50

1

一个搜索的方式来保持类和测试地点在同步移动代码的时候:

  • 移动代码的唯一命名的临时命名空间
  • 搜索到你的测试该命名空间的引用,以确定所需要的测试移动
  • 移动测试,以适当的新位置
  • 一旦所有引用从测试的临时命名空间是在正确的地方,那么原来的代码移动到其预期目标端到的

一个实力最终测试或行为测试是测试按需求分组而不是代码分组,因此您避免了使测试位置与相应代码保持同步的问题。

1

关于VS扩展,联想代码测试,看看在Visual Studio的测试的影响。它在分析器下运行测试并创建一个紧凑的数据库,将IL序列点映射到单元测试。换句话说,当您更改代码时,Visual Studio知道需要运行哪些测试。

+0

谢谢,我一定会看看它。 – 2012-07-22 08:47:05