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

Parameters 如何使用TestDriven.NET指定测试方法参数?,parameters,nunit,testing,testdriven.net,Parameters,Nunit,Testing,Testdriven.net,我正在用NUnit和TestDriven.NET插件编写单元测试。我想为测试方法提供如下参数: [TestFixture] public class MyTests { [Test] public void TestLogin(string userName, string password) { // ... } ... } 如您所见,这些参数是私有数据,所以我不想硬编码它们或将它们放入文件中。实际上,我不想在任何地方编写它们,我希望

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

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

    ...
}
如您所见,这些参数是私有数据,所以我不想硬编码它们或将它们放入文件中。实际上,我不想在任何地方编写它们,我希望每次运行测试时都得到提示

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

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

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

对不起,如果我的问题看起来很愚蠢,答案可能很简单,但我在谷歌上找不到任何有用的东西


编辑:我刚找到一个方法,但这是一个肮脏的把戏

    [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 }
            };
        }
    }

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

我认为您可以通过使用此处找到的NUnit的RowTest插件来解决这个问题

您可以创建简单的数据驱动测试,其中测试数据由[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);
 }
} 
单元测试通常不应采用任何参数。您可以在测试本身中创建必要的数据

  • 期望值
  • 通过传递必要的参数,调用要测试的方法
  • 将结果与测试方法的预期值和返回值进行比较
MS单元测试不允许将参数传递给测试。相反,您需要创建。试试这个链接,它可能会对你有所帮助

正如我提到的。我不会声明将参数传递给单元测试本身是一个好的实践


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

使用属性。

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

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

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

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


这是针对一个项目的,其中包含测试(而不是定义为单元测试)的excel表被用来让其他人在不更改任何代码的情况下为更大的服务器端项目创建测试用例。如果所有的测试用例都被迫放在一张巨大的excel表格中,那就太糟糕了。此外,没有CI,只是不同服务器上的许多测试环境。

我认为如果您这样做,您将无法在CI(连续集成)环境中自动运行测试。您完全正确。然而,这是一个小的社区项目,所以CI并不是一个真正的问题,至少现在是这样。谢谢你的回答。我认为NUnit 2.5()中新增的TestCaseAttribute使这个插件过时了。无论如何,这并不能解决我的问题:我不想硬编码我的凭证。我想要一个提示,当测试运行正常时手动输入它。我误解了。很高兴了解TestCaseAttribute:)谢谢,但它并不能解决我的问题。。。我应该如何运行需要凭据的测试?我不想把我的个人用户名和密码放在与他人共享的代码中……在这种情况下,请使用虚拟凭据。你的单元测试应该包含什么样的逻辑?你需要凭证处理等等?哦,我现在读了你编辑的文章。你就不能用一些假凭证吗。有权访问您需要实现的内容的测试用户+通过?虽然我不太确定你想要达到的东西是否真的应该通过单元测试来测试。检查这一点:理解……什么是单元测试和什么不是单元测试总是有点“可讨论”。在您的情况下,我会说这并不是我用单元测试所能捕捉到的。我要做的是提供一个虚拟身份验证cookie,并以某种方式注入它,以伪造对VBulletin的调用。通过这种方式,我将测试我的逻辑在正确的cookie上做了什么,在错误的cookie上做了什么。在我看来,单元测试应该捕捉到这一点。Juri和J.R.Garcia是正确的。您需要无人参与、自动化的测试—这样您就可以从构建服务器等运行它们。实现这一点的方法是使用依赖项注入和处理身份验证的虚拟(存根)对象。在实际的应用程序中,您将注入真正的身份验证方案(实现相同的接口)。+1。通过在TestCase()参数中正确处理依赖项注入,而不是重复“方法中没有参数”,这比选择的答案要好得多。不幸的是,我不认为MS单元测试有这样的东西,只是这是正确和简短的答案。无论这是好的还是坏的做法,请将此标记为正确答案。这就回答了这个问题,对我来说,通常使用params并不是一个坏习惯。至于密码,我不太喜欢。