C# TDD中的命名测试与单元测试命名

C# TDD中的命名测试与单元测试命名,c#,unit-testing,tdd,nunit,bdd,C#,Unit Testing,Tdd,Nunit,Bdd,我已经使用TDD进行了大量的开发测试;i、 我先写我的测试 我一直习惯于这样编写测试,使用这种命名约定 MethodName_DoesWhat_WhenTheseConditions 这些对于单元测试非常有用,因为我知道方法名是什么,但是在做TDD时我不知道方法名。例如,我有一个用户故事 "As a user, I can return the total number of records in the database" 现在看看这个,我马上就知道我会有很多方法,层 但是我现

我已经使用TDD进行了大量的开发测试;i、 我先写我的测试

我一直习惯于这样编写测试,使用这种命名约定

  MethodName_DoesWhat_WhenTheseConditions
这些对于单元测试非常有用,因为我知道方法名是什么,但是在做TDD时我不知道方法名。例如,我有一个用户故事

    "As a user, I can return the total number of records in the database"
现在看看这个,我马上就知道我会有很多方法,层

但是我现在不知道TDD中这些方法的名称,所以尝试在测试名称前加前缀有意义吗?这里有人有什么建议吗


另外,一旦我编写了我的测试和方法/类,并且一切正常,创建额外的“单元测试”来测试我没有通过TDD测试的类是否有意义?

鉴于您的用户故事,我的测试名称应该是这样的:

  • 当选项卡为空时,是否应设置为零
  • 当他们在同一个地方时应该去吗
  • 当有两个记录时,应该得到

测试类类似于DatabaseRecordCounterTest。

测试命名有很多方法,您提到的就是其中之一。使用方法名作为前缀是很好的(并且适用于大多数情况),但是当单元测试跨越多个方法(例如)时,您可能会遇到一些小问题

使用TDD,您应该从用户故事开始(就像现在一样),并相应地命名您的测试。只有这样,您才能进入实施阶段。使用TDD,您的方法名称将由测试驱动

此外,一旦我编写了测试和方法/类,并且一切正常,那么创建额外的“单元测试”来测试类中我没有通过TDD测试的内容是否有意义


通过TDD,你不应该做任何事情。这就是重点——您通过测试来驱动您的设计和实现。您不会编写一行不会源于测试失败的代码。

我喜欢使用两种方法,这两种方法是我从和中偷来的

基本上,有一个基类定义被测试的类,然后是继承的类,这些类根据要测试的行为命名。然后添加带有详细名称的测试

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
        }
    }
}
使用该系统,测试类名(在本例中为
ThisMethod
ThatMethod
)可以抽象为您测试的行为方面,直到命名有意义为止。您可以从按照所需的行为命名开始,然后将行为名称重构为函数名称(如果适用),或者对其进行细化(例如,如果行为跨越多个方法,例如:
InstanciatioAndInitialization
,使用测试
初始化\u必须在任何其他\u调用\u系统之前\u调用\u)。一个很好的好处是,所有测试都在逻辑上分组到相同的上下文中,这在您的测试UI中表现得很好。

通过遵循“由外而内”的开发方法,您将发现/发展TDD单元测试名称,作为开发过程的一部分(也请参见此答案)

例如,以您的用户故事为例(我稍微修改了它):

在编写这个故事时,你会将它分解为许多场景,例如

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
您还可以使用这种方法“伪造它,直到您成功”,也就是说,您可以模拟某些依赖项(例如授权机制),以便您可以专注于实现场景的关键功能


因此,按照这种方法,您将逐步开发用户故事所需的所有功能,同时创建精确的单元测试以满足场景要求。

这些答案有帮助吗?你找到解决问题的办法了吗?
WhenSubmitValidCredentials_ShouldBeAuthorised