【问题标题】:How do I specify test method parameters with TestDriven.NET?如何使用 TestDriven.NET 指定测试方法参数?
【发布时间】:2009-09-05 02:52:19
【问题描述】:

我正在使用 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 }
            };
        }
    }

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

【问题讨论】:

  • 我认为如果您这样做,您将无法在 CI(持续迭代)环境中自动运行测试。
  • 你说得对。不过,这是一个小型社区项目,因此 CI 并不是真正的问题,至少目前是这样。

标签: parameters nunit testing testdriven.net


【解决方案1】:

使用TestCase 属性。

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

【讨论】:

  • +1。通过在 TestCase() 参数中处理依赖注入而不是模仿“方法中没有参数”,这比选择的答案要好得多。不幸的是,我不认为 MS Unit Test 有这样的东西,只有 Nunit
  • 这是正确而简短的答案。不管这是好还是坏的做法。
  • 请将此标记为正确答案。这回答了这个问题,对我来说,一般使用参数并不是一个坏习惯。对于密码,我不太愿意。
【解决方案2】:

单元测试通常不应该使用任何参数。您在测试本身中创建必要的数据。

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

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

正如我所提到的。我不会声明将参数传递给单元测试本身就是好的做法。


更新:我还年轻 :)。请考虑 Sarfraz 关于如何将参数传递给 NUnit 测试的答案。

【讨论】:

  • 谢谢,但同样,它并不能解决我的问题...我应该如何运行需要凭据的测试?我不想将我的个人用户名和密码放在将与他人共享的代码中......
  • 在这种情况下使用虚拟凭据。您的单元测试应该涵盖什么样的逻辑?您需要凭据处理等?
  • 哦,我现在阅读了您编辑的帖子。你不能只使用一些虚拟凭据。有权访问您需要实现的目标的测试用户 + 通行证?虽然我不太确定你想要达到的那种东西是否真的应该通过单元测试来测试。检查这个:stackoverflow.com/questions/1257560/…
  • 理解......好吧,它总是有点“可讨论”什么是单元测试,什么不是单元测试。在您的情况下,我会说这并不是我通过单元测试捕获的内容。我要做的是提供一个虚拟身份验证cookie并以某种方式注入它来伪造对VBulletin的调用。通过这种方式,我将测试我的逻辑对正确的 cookie 的作用以及对错误的 cookie 的作用。这就是我认为应该通过单元测试捕获的内容。
  • Juri 和 J.R. Garcia 是正确的。您需要无人值守的自动化测试 - 这样您就可以从构建服务器等运行它们。这样做的方法是使用依赖注入和处理您的身份验证的虚拟(存根)对象。在实际应用中,你注入真正的认证方案(实现相同的接口)。
【解决方案3】:

我认为您可以通过使用此处找到的 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);
 }
} 

【讨论】:

  • 感谢您的回答。我认为这个插件已经被 NUnit 2.5 (nunit.org/index.php?p=testCase&r=2.5) 中的新 TestCaseAttribute 淘汰了。无论如何,它不能解决我的问题:我不想硬编码我的凭据。我想要在测试运行时提示手动输入它
  • 嗯,好的。我误解了。很高兴知道 TestCaseAttribute :)
【解决方案4】:

我同意其他答案,即传递参数可能不是最佳实践,但硬编码凭据或服务器地址也不是在某些时候可能会更改。

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

nunit tests.dll < test.config

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

这是针对一个项目,其中包含测试的 Excel 工作表(不是定义的单元测试)用于让其他人在不更改任何代码的情况下为更大的服务器端项目创建测试用例。如果所有测试用例都必须强制放在一个巨大的 Excel 表中,那就太糟糕了。也没有 CI,只有不同服务器上的许多测试环境。

【讨论】:

    猜你喜欢
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多