命名测试在TDD VS单元测试命名

问题描述 投票:4回答:4

我一直在做一些使用TDD开发测试;即先写我的测试。

我一直被用来编写像这样的测试,使用这种命名约定。

  MethodName_DoesWhat_WhenTheseConditions

这些单元测试工作的伟大,因为我知道的方法名是什么,但这样做TDD我不知道的方法名。比如我有状态的用户故事

    "As a user, I can return the total number of records in the database"

现在只是考虑看看这个,我知道马上我将有许多方法,层。

但我不知道这些方法的名称在TDD现在,所以它是有意义的尝试和前缀测试的名字呢?没有人有任何建议吗?

也曾经我写我的测试,我的方法/类和一切工作是否有意义创造更多的“单元测试”来测试我的东西通过TDD没有阶级?

c# unit-testing tdd nunit bdd
4个回答
4
投票

通过下面的“外到内”的发展方针,你会发现/发展你的TDD单元测试的名称作为开发过程的一部分(见这个答案here

例如把你的用户故事(我稍加修正它):

As a user
I want to know the total number of records in the database
So that I can report back to the business owner

在开发这个故事,你会分解成若干场景如

Given a user logs in
When they request the total number of records
Then they should be presented with the result

在这个阶段,你还是不知道你需要什么单元测试。然而,使用“外到内”的开发方式,你现在想恢复到TDD技术来实现必要的功能。

例如,你会使用你的正常TDD方式未来实现登录设施。因此,你可能有一个名为测试方法:

WhenSubmitValidCredentials_ShouldBeAuthorised

您也可以“假,直到你把它”使用这种方法,即你可以嘲笑某些依赖(如授权机制),使您可以专注于实施方案的主要特点。

所以下面这种方法,你会逐步开发所有的你的用户故事,而创建精确的单元测试,以满足场景所需的功能。


2
投票

考虑到用户的故事,我的测试名称会是这样的:

  • shouldGetZeroWhenTheDatabaseIsEmpty
  • shouldGetOneWhenThereIsOneRecord
  • shouldGetTwoWhenThereAreTwoRecords

而测试类会是这样的DatabaseRecordCounterTest。


1
投票

有许多方法来测试命名,你提到的是其中之一的一个。用方法名加前缀是好的(并适用于最大多数情况下),但是当你的单元测试通过跨越多种方法(即common add-remove or add-search combinations),你可能会遇到一些小问题。

随着TDD,你应该与用户故事开始(因为你现在做的),并依此命名测试。只有这样,你去实现。随着TDD,你的方法名称将通过测试来驱动。

也曾经我写我的测试,我的方法/类和一切工作是否有意义创造更多的“单元测试”来测试我的东西通过TDD没有阶级?

不应该有你不通过TDD做一件事。这是整点 - 你开你的设计和实现通过测试。你不写的代码,不会从失败测试起源单行。


0
投票

我喜欢用两种方法是我从Phil HaackErik Dietrich偷走

基本上有是定义被测类的基类,那么继承被它们将测试行为的名字命名的类。测试然后用冗长的名字加入。

public class TestClassUnderTest
{
    public ClassUnderTest Target { get; set; }
    [SetUp]
    public void before_each_test()
    {
        Target = new ClassUnderTest();
    }

    // Now each behavior has its own class with the system under test available through the Target property
    public class ThisMethod : TestClassUnderTest
    {
        [Test]
        [ExpectedException(typeof(Exception))]
        public void throws_if_null_is_passed()
        {
            Assert.IsTrue(false); // make it fail at first
        }

        [Test]
        public void returns_true_if_string_is_empty()
        {
            Assert.IsTrue(false); // make it fail at first
        }
    }

    public class ThatMethod : TestClassUnderTest
    {
        [Test]
        public void returns_argument_concatenated_with_timestamp()
        {
            Assert.IsTrue(false); // make it fail at first
        }
    }
}

有了这个系统测试类的名称(在这个例子中ThisMethodThatMethod)可以抽象成你正在测试针对直到命名是有意义的行为方面。您可以通过后所需的行为将其命名为开始,然后或者如果适用重构行为名称为函数名,或者(如果该行为跨越多个方法,例如例如:InstanciatioAndInitialization与测试initialization_must_be_called_before_any_other_calls_to_the_system)完善它。一个不错的奖金是所有测试在逻辑上划分成相同的情况下,在你测试UI这使得很好。

© www.soinside.com 2019 - 2024. All rights reserved.