Unit testing 如何以规范的形式编写单元测试?

Unit testing 如何以规范的形式编写单元测试?,unit-testing,tdd,coding-style,bdd,Unit Testing,Tdd,Coding Style,Bdd,在许多情况下,我很难为类和方法找到一个好的单元测试名称。通常,我会尝试遵循以下形式: public class TestContext { [Fact] public void WhenThis_DoThat() { } } 有些人把给定的单词、时间、然后放在要明确的部分。我喜欢它,因为它似乎使单元测试更清楚地说明它正在测试什么。 除了考虑BDD工具包之外,我还需要一些关于如何使用普通的老xUnit工具的建议 我对这样的场景感到特别困难: public clas

在许多情况下,我很难为类和方法找到一个好的单元测试名称。通常,我会尝试遵循以下形式:

public class TestContext
{
    [Fact]
    public void WhenThis_DoThat()
    {
    }
}
有些人把给定的单词、时间、然后放在要明确的部分。我喜欢它,因为它似乎使单元测试更清楚地说明它正在测试什么。 除了考虑BDD工具包之外,我还需要一些关于如何使用普通的老xUnit工具的建议

我对这样的场景感到特别困难:

public class CustomerLookupTest extends TestCase { testFindsCustomerById() { ... } testFailsForDuplicateCustomers() { ... } ... }
CustomerLookup – finds customer by id – fails for duplicate customers – ...
当应用程序启动时,主窗体将加载,用户将看到 用户可以单击的链接

或者更好的用例场景是:

用户可以从列表中选择链接 链接

我不确定,但我试图描述一种行为,在这种行为中,您运行一个应用程序,表单加载一个可单击链接列表。并将其转化为单元测试


什么是给定的,什么时候,然后是给定的?

我尝试遵循罗伊·奥舍洛夫的方法:


在您的场景中,会出现什么问题?单元测试需要测试一些东西,那么您要测试什么呢

表单链接

装货单//然后检查链接


也许如果你说你的测试是什么而不是你在做什么,你会发现这更容易。

我以输入命名我的测试,而不是以输出命名。我描述了正在测试的场景:我不试图以测试用例的名义定义该场景中所需的输出

例如,以下步骤测试文本编辑器中Backspace键在各种情况下的行为:

  • 空格后退格
  • 内联textrun边缘周围的退格
  • 段落开头的退格
  • 行尾附近的退格
  • 段落内的退格规范化
  • 将所选单词和两个空格退格
  • 退格选定的单词和空格
  • 退格选定单词
  • 退格选择跨越两个段落
  • 将几个单词退格
  • 退格空格和所选单词
  • 退格到其他块的远边

因此,您或多或少可以看到正在测试的场景(但它也不会试图告诉您每个场景中的预期行为)。

以下是我如何以BDD规范风格编写测试:

所需要的是在一个类中拥有多个测试夹具的能力。然后可以组织测试,使每个夹具都是“给定/何时”零件,每个测试方法都是“当时”零件。JUnit不支持它,所以我为此编写了:

我引用丹·诺斯的话:

测试方法名称应该是句子 我的第一个“啊哈!”时刻发生在我 这是一个看似简单的问题 实用程序调用,由我的 同事克里斯·史蒂文森。这需要一段时间 JUnit测试类并打印出 方法名称为简单的句子,因此 如下所示的测试用例:

public class CustomerLookupTest extends TestCase { testFindsCustomerById() { ... } testFailsForDuplicateCustomers() { ... } ... }
CustomerLookup – finds customer by id – fails for duplicate customers – ...
呈现如下内容:

public class CustomerLookupTest extends TestCase { testFindsCustomerById() { ... } testFailsForDuplicateCustomers() { ... } ... }
CustomerLookup – finds customer by id – fails for duplicate customers – ...
“测试”一词从这两个词中删去 类名和方法名, camel-case方法名为 转换成常规文本。那是 所有这些都可以,但它的效果是 太棒了

开发人员发现它可以在 至少他们的一些文档 他们,所以他们开始写测试 方法是真实的句子。 更重要的是,他们发现当他们 用语言编写方法名称 对于业务域,生成 文件对商业有意义 用户、分析师和测试人员


整篇论文实际上值得一读。热烈推荐

那么,举个例子,你会给OP中作为例子给出的测试起什么名字?我也喜欢Roy的风格-我买了他的单元测试艺术书,这本书很好-但是像ChrisW一样,你能用Roy的方法试试我的例子吗?依我看,这与单元测试无关。请称之为验收测试或功能测试,但不要称之为单元测试。@Pascal Thivent:我所有的单元测试都是用这种风格编写的。在我的示例中,我测试的是应用程序启动时表单上是否显示了链接列表。嗨,Esko,你可以使用@RunWith(Suite.class)获得相同的行为。更详细的是,您还必须添加@Suite.suiteClass({MyClass.MySubclass,MyClass.MyOtherSubclass}),但您不需要依赖JUnit以外的任何东西。例如