C# TDD中的命名测试与单元测试命名
我已经使用TDD进行了大量的开发测试;i、 我先写我的测试 我一直习惯于这样编写测试,使用这种命名约定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" 现在看看这个,我马上就知道我会有很多方法,层 但是我现
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