BDD为几种方法命名

时间:2017-02-09 08:48:03

标签: c# .net bdd

当您正在测试的类中有一种方法时,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()
    {
      ...
    }
  }
}

老实说,两种方法都有一点感觉(可能只是因为我不习惯)。推荐的方式是什么?

3 个答案:

答案 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开发人员的名称约定......