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

时间:2009-10-05 19:33:06

标签: unit-testing tdd coding-style bdd

在很多情况下,我很难为类和方法提供一个好的单元测试名称。通常,我尝试遵循以下表格:

public class TestContext
{
    [Fact]
    public void WhenThis_DoThat()
    {
    }
}

有些人把词语给定,何时,然后在部分上明确。我喜欢它,因为它似乎使单元测试更清楚它正在测试它是什么。 除了考虑BDD工具包之外,我还需要一些关于如何使用普通旧xUnit工具的建议。

我在这样的场景中遇到了特别困难:

  

当应用程序启动时,主窗体加载,用户看到一个列表   用户可以点击的链接。

或者更好的用例场景是:

  

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

我不确定,但我正在尝试描述运行应用程序的行为,并且表单加载了可点击链接列表。并将其转变为单元测试。

什么是给定,何时,然后呢?

5 个答案:

答案 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)

答案 3 :(得分:0)

在你的场景中会出现什么问题?单元测试需要测试一些东西,所以你在测试什么。

FormHasLinks?

LoadForm? //然后检查链接

也许如果你说你的测试而不是你做的事情你会发现它更容易。

答案 4 :(得分:0)

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

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

  • 空格后退格
  • 内联textrun边缘的退格
  • 段落开头的退格
  • 靠近行尾的退格
  • Backspace在段落
  • 中规范化
  • 退格选择的单词和两个空格
  • 退格选择的单词和空格
  • 退格选择的单词
  • 退格选择跨越两段
  • 退格几个字
  • 退格空格和选定的单词
  • 退格到其他块的远边缘

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