当您正在测试的类中有一种方法时,BDD命名方法非常有效。假设我们有一个具有Connect方法的Connector类:
Should_change_status_to_Connected_if_Disconnected
漂亮吧?但是当我在一个类中有几个方法时,我必须为测试命名时感到困惑(假设我们在我们的类中添加了Disconnect方法)。
我看到两种可能的解决方案。第一个是添加一个方法名称的前缀,如:
Should_change_status_to_Connected_if_Disconnected_when_Connect_was_called
另一种方法是为您正在测试的每种方法引入嵌套测试类。
public class ConnectorTests
{
public class ConnectTests
{
public void Should_change_status_to_Connected_if_Disconnected()
{
...
}
}
public class DisconnectTests
{
public void Should_change_status_to_Disconnected_if_Connected()
{
...
}
}
}
老实说,两种方法都有一点感觉(可能只是因为我不习惯)。推荐的方式是什么?
答案 0 :(得分:1)
在我的情况下,首先,我尝试根据前后条件分类,因此我可以将一些行为分组并将相关内容保持在一起。例如,在您的情况下,一个前提条件可能是“Disconnected”,因此,您可以使用ClassInitialize,TestInitialize,TestCleanup,ClassCleanup等属性准备“断开连接的环境”。(here some examples in MSDN)
请按照其他开发人员的建议,不要忘记naming conventions。
希望这有帮助,问候。
答案 1 :(得分:1)
我用不同的命名方式编写了剂量测试。本质上,此类测试方法由于名称太长而难以阅读,它们超出了每行符号的限制,通常强调的方法名称违背了命名约定。当您要向BDD方案中添加“和”条件或前提条件时,就会遇到麻烦,例如“初始化连接器时,如果断开连接且网络可用且参数1为...且参数2为...,则应将状态更改为已连接”。因此,您必须将测试用例分为许多类,子文件夹等。这会增加开发和支持的时间。
C#的另一种方式是编写类似于JavaScript测试框架的测试:Jasmine,Jest等。对于类和方法的单元测试,我将在功能/故事场景中使用Arrange / Act / Assert风格和BDD风格,但是两种样式都可以使用。在C#中,我使用Heleonix.Testing.NUnit库并以AAA或BDD(GWT)样式编写测试:
using NUnit.Framework;
using Heleonix.Testing.NUnit.Aaa;
using static Heleonix.Testing.NUnit.Aaa.AaaSpec;
[ComponentTest(Type = typeof(Connector))]
public static class ConnectorTests
{
[MemberTest(Name = nameof(Connector.Connect))]
public static void Connect()
{
Connector connector = null;
Arrange(() =>
{
connector = new Connector();
});
When("the Connect is called", () =>
{
Act(() =>
{
connector.Connect(options);
});
And("the Connector is disconnected", () =>
{
Arrange(() =>
{
connector.Disconnect();
});
});
Should("change the status to Disconnected", () =>
{
Assert.That(connector.Disconnected, Is.True);
});
});
}
}
对我来说重要的是,几个月后我可以打开此类测试并清楚地回忆一下那里写的内容,而不必花几个小时来了解测试的内容/方式。
答案 2 :(得分:0)
由于测试用例完全相互独立,因此必须使用静态类来初始化稍后将用于测试的值,连接等。如果您想使用个人值和启动器,您必须单独在类中声明它们。我用于这个nunit框架。
顺便说一句,你在c#中,使用.net开发人员的名称约定......