命名单元测试类和测试方法的最佳实践是什么?

这在之前的SO中讨论过,在什么是单元测试的一些流行命名约定?

我不知道这是否是一种非常好的方法,但目前在我的测试项目中,我在每个生产类和测试类之间都有一对一的映射,例如Product和ProductTest。

在我的测试类中,我有我正在测试的方法的名称,一个下划线,然后是情况和我期望发生的事情,例如Save_ShouldThrowExceptionWithNullName()。


当前回答

我应该补充一点,将您的测试放在同一个包中,但位于与被测试的源代码并行的目录中,一旦您准备好部署它,就可以消除代码的膨胀,而不必执行一堆排除模式。

我个人喜欢“JUnit Pocket Guide”中描述的最佳实践……很难有一本书比JUnit!

其他回答

看到的: http://googletesting.blogspot.com/2007/02/tott-naming-unit-tests-responsibly.html

对于测试方法名称,我个人认为使用详细的和自文档化的名称非常有用(以及进一步解释测试正在做什么的Javadoc注释)。

Kent Beck建议:

每个“单元”(程序的类)一个测试夹具。测试fixture本身就是类。测试夹具的名称应该是: [您的“单元”名称]测试 测试用例(测试夹具方法)的名称如下: 测试[正在测试的功能]

例如,拥有以下类:

class Person {
    int calculateAge() { ... }

    // other methods and properties
}

测试夹具应该是:

class PersonTests {

    testAgeCalculationWithNoBirthDate() { ... }

    // or

    testCalculateAge() { ... }
}

我喜欢遵循测试的“Should”命名标准,同时以被测单元(即类)命名测试夹具。

为了说明(使用c#和NUnit):

[TestFixture]
public class BankAccountTests
{
  [Test]
  public void Should_Increase_Balance_When_Deposit_Is_Made()
  {
     var bankAccount = new BankAccount();
     bankAccount.Deposit(100);
     Assert.That(bankAccount.Balance, Is.EqualTo(100));
  }
}

为什么“应该”?

我发现它迫使测试编写人员用这样一句话来命名测试:“应该[处于某种状态][在动作发生之后/之前/当][发生时]”

是的,到处写“应该”确实有点重复,但正如我所说,它迫使作者以正确的方式思考(所以对新手来说很好)。此外,它通常会产生一个可读的英文测试名称。

更新:

我注意到Jimmy Bogard也是“should”的粉丝,他甚至有一个名为“should”的单元测试库。

更新(4年后…)

For those interested, my approach to naming tests has evolved over the years. One of the issues with the Should pattern I describe above as its not easy to know at a glance which method is under test. For OOP I think it makes more sense to start the test name with the method under test. For a well designed class this should result in readable test method names. I now use a format similar to <method>_Should<expected>_When<condition>. Obviously depending on the context you may want to substitute the Should/When verbs for something more appropriate. Example: Deposit_ShouldIncreaseBalance_WhenGivenPositiveValue()

我喜欢这样的命名风格:

OrdersShouldBeCreated();
OrdersWithNoProductsShouldFail();

等等。 它让非测试人员清楚地知道问题所在。

我应该补充一点,将您的测试放在同一个包中,但位于与被测试的源代码并行的目录中,一旦您准备好部署它,就可以消除代码的膨胀,而不必执行一堆排除模式。

我个人喜欢“JUnit Pocket Guide”中描述的最佳实践……很难有一本书比JUnit!