4

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

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

有些人将 Given、When 和 Then 放在要明确的部分上。我喜欢它,因为它似乎使单元测试更清楚地表明它正在测试什么。除了考虑 BDD 工具包之外,我还需要一些关于如何使用普通旧 xUnit 工具的建议。

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

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

或者更好的用例场景是:

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

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

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

4

5 回答 5

6

以下是我如何以 BDD 规范风格编写测试:http: //github.com/orfjackal/tdd-tetris-tutorial

需要的是在一个类中拥有多个测试夹具的能力。然后可以组织测试,每个夹具都是“Given/When”部分,每个测试方法都是“Then”部分。JUnit 不支持它,所以我为它写了一个简单的测试运行器:

@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() {
            ...
        }
    }
}
于 2009-10-05T20:40:07.537 回答
4

我引用了 Dan North 的BDD 介绍:

测试方法名称应该是句子

我的第一个“啊哈!” 当我看到由我的同事克里斯·史蒂文森(Chris Stevenson)编写的一个名为agiledox的看似简单的实用程序时,这一刻发生了。它需要一个 JUnit 测试类并将方法名称打印为简单的句子,因此测试用例如下所示:

public class CustomerLookupTest extends TestCase { testFindsCustomerById() { ... } testFailsForDuplicateCustomers() { ... } ... }

呈现如下内容:

CustomerLookup – finds customer by id – fails for duplicate customers – ...

从类名和方法名中去掉“test”一词,并将驼峰式方法名转换为常规文本。这就是它所做的一切,但它的效果是惊人的。

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

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

于 2009-10-06T00:03:21.647 回答
0

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

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

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

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

于 2009-10-05T20:28:03.740 回答
0

我尝试遵循 Roy Osherove 的方法:

http://weblogs.asp.net/rosherove/archive/2005/04/03/TestNamingStandards.aspx

于 2009-10-05T19:37:04.407 回答
0

在您的情况下会出现什么问题?单元测试需要测试一些东西,那么你在测试什么。

表单有链接?

加载表格?//然后检查链接

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

于 2009-10-05T19:37:25.073 回答