在很多情况下,我很难为类和方法提供一个好的单元测试名称。通常,我尝试遵循以下表格:
public class TestContext
{
[Fact]
public void WhenThis_DoThat()
{
}
}
有些人把词语给定,何时,然后在部分上明确。我喜欢它,因为它似乎使单元测试更清楚它正在测试它是什么。 除了考虑BDD工具包之外,我还需要一些关于如何使用普通旧xUnit工具的建议。
我在这样的场景中遇到了特别困难:
当应用程序启动时,主窗体加载,用户看到一个列表 用户可以点击的链接。
或者更好的用例场景是:
用户可以从列表中选择一个链接 链接。
我不确定,但我正在尝试描述运行应用程序的行为,并且表单加载了可点击链接列表。并将其转变为单元测试。
什么是给定,何时,然后呢?
答案 0 :(得分:6)
以下是我用BDD规范样式编写测试的方法:http://github.com/orfjackal/tdd-tetris-tutorial
需要的是能够在一个类中拥有多个测试装置。然后可以组织测试,每个夹具是“给定/何时”部分,每个测试方法是“然后”部分。 JUnit不支持它,所以我为它写了a simple test runner:
@RunWith(NestedJUnit4.class)
public class WerewolfTest extends Assert {
public class Given_the_moon_is_full {
@Before public void When_you_walk_in_the_woods() {
...
}
@Test public void Then_you_can_hear_werewolves_howling() {
...
}
@Test public void Then_you_wish_you_had_a_silver_bullet() {
...
}
}
public class Given_the_moon_is_not_full {
@Before public void When_you_walk_in_the_woods() {
...
}
@Test public void Then_you_do_not_hear_any_werewolves() {
...
}
@Test public void Then_you_are_not_afraid() {
...
}
}
}
答案 1 :(得分:4)
我引用Dan North的Introducing BDD:
测试方法名称应为句子
我的第一个“啊哈!”那一刻发生在我身上 被证明是一个看似简单的东西 名为agiledox的实用程序,由我写的 同事克里斯史蒂文森。需要一个 JUnit测试类并打印出来 方法名称为普通句子,所以a 测试用例如下所示:
public class CustomerLookupTest extends TestCase { testFindsCustomerById() { ... } testFailsForDuplicateCustomers() { ... } ... }
呈现如下内容:
CustomerLookup – finds customer by id – fails for duplicate customers – ...
从两者中删除“测试”一词 类名和方法名, 而camel-case方法名称是 转换成普通文本。那是 所有这一切,但其效果是 惊人的。
开发人员发现它可以做到 至少他们的一些文档 他们,所以他们开始写测试 方法是真正的句子。 而且,当他们发现时,他们发现了 用语言写了方法名 业务领域,生成 文件对企业有意义 用户,分析师和测试人员。
全文实际上值得一读。热烈推荐!
答案 2 :(得分:0)
我尝试遵循Roy Osherove的方法:
http://weblogs.asp.net/rosherove/archive/2005/04/03/TestNamingStandards.aspx
答案 3 :(得分:0)
在你的场景中会出现什么问题?单元测试需要测试一些东西,所以你在测试什么。
FormHasLinks?
LoadForm? //然后检查链接
也许如果你说你的测试而不是你做的事情你会发现它更容易。
答案 4 :(得分:0)
我在输入之后命名我的测试,而不是在输出之后。我描述了正在测试的场景:我不会尝试以测试用例的名义定义该场景中所需的输出。
例如,以下在各种情况下测试文本编辑器中Backspace键的行为:
因此,您可以看到或多或少正在测试的场景(但它也不会试图告诉您每个场景中的预期行为)。