如何使用TestDriven.NET指定测试方法参数?

时间:2009-09-05 02:52:19

标签: parameters nunit testing testdriven.net

我正在使用NUnit和TestDriven.NET插件编写单元测试。我想为这样的测试方法提供参数:

[TestFixture]
public class MyTests
{
    [Test]
    public void TestLogin(string userName, string password)
    {
        // ...
    }

    ...
}

如您所见,这些参数是私有数据,因此我不想对它们进行硬编码或将它们放在文件中。实际上我不想把它们写在任何地方,我希望每次运行测试时都会被提示。

当我尝试运行此测试时,我在输出窗口中收到以下消息:

  

TestCase'MyProject.MyTests.TestLogin'未执行:未提供任何参数

所以我的问题是,我该如何提供这些参数?我希望TestDriven.NET显示一个提示,以便我可以输入值,但它没有......

很抱歉,如果我的问题看起来很愚蠢,答案可能非常简单,但我在Google上找不到任何有用的内容......


编辑:我刚刚找到了办法,但这是一个肮脏的伎俩......

    [Test, TestCaseSource("PromptCredentials")]
    public void TestLogin(string userName, string password)
    {
        // ...
    }

    static object[] PromptCredentials
    {
        get
        {
            string userName = Interaction.InputBox("Enter user name", "Test parameters", "", -1, -1);
            string password = Interaction.InputBox("Enter password", "Test parameters", "", -1, -1);
            return new object[]
            {
                new object[] { userName, password }
            };
        }
    }

我仍然对更好的解决方案感兴趣...

4 个答案:

答案 0 :(得分:22)

使用TestCase属性。

[TestCase("User1", "")]
[TestCase("", "Pass123")]
[TestCase("xxxxxx", "xxxxxx")]
public void TestLogin(string userName, string password)
{
    // ...
}

答案 1 :(得分:2)

我认为您可以使用此处找到的NUnit的RowTest插件来解决此问题http://www.andreas-schlapsi.com/2008/01/29/rowtest-extension-120/

您可以创建简单的数据驱动测试,其中测试数据由[Row]属性提供。所以这是一个使用不同参数反复运行的测试示例:

[TestFixture]
public class RowTestSample
{
 [RowTest]
 [Row( 1000, 10, 100.0000)]
 [Row(-1000, 10, -100.0000)]
 [Row( 1000, 7, 142.85715)]
 [Row( 1000, 0.00001, 100000000)]
 [Row(4195835, 3145729, 1.3338196)]
 public void DivisionTest(double numerator, double denominator, double result)
 {
    Assert.AreEqual(result, numerator / denominator, 0.00001);
 }
} 

答案 2 :(得分:2)

单元测试通常不应采用任何参数。您可以在测试中创建必要的数据。

  • 预期值
  • 您调用要测试的方法传递必要的参数
  • 您将结果与预期值和测试方法的返回值进行比较

MS单元测试不允许将参数传递给测试。相反,您需要创建Datadriven Unit tests。试试这个链接,它可以帮到你。

正如我所说。我不会声明将参数传递给单元测试本身的良好实践。


更新:我还年轻:)。考虑Sarfraz的答案,而不是如何将参数传递给NUnit测试。

答案 3 :(得分:0)

我同意其他答案,即传递参数可能不是最佳实践,但硬编码凭证或服务器地址都不会在某些时候发生变化。

受建议的解决方案的启发,我只是阅读控制台输入而不是使用输入框。参数保存在文件中。在开始测试时,文件被重定向并从一些初始化函数中读取,该函数应在任何测试用例运行之前调用。

nunit tests.dll < test.config

这可以避免用户交互,并且应该可以由任何自动化脚本运行。缺点是密码仍然需要保存在某个地方,但至少它可以保存在测试机上的本地,并且很容易更改。

这是针对一个项目,其中包含测试的excel表(不是定义中的单元测试)用于让其他人为更大的服务器端项目创建测试用例而不更改任何代码。如果所有的测试案例都必须强制放在一个巨大的excel表中,那将会很糟糕。此外,没有CI,只有不同服务器上的许多测试环境。