单元测试多个断言

时间:2014-10-16 09:13:19

标签: c# asp.net unit-testing mstest

我正在尝试使用MSTest对C#中的方法进行单元测试。我正在测试ChangePasswordAsync方法强制密码复杂性。我的问题是我想用一系列参数测试这个方法。目前我有一个单元测试,有多个断言来测试不同的参数,这是一个合理的解决方案吗?

我知道当我使用其他单元测试框架时,已经有方法测试具有不同参数的方法。我可以在方法上使用一个属性来实现这个目的吗?我的示例单元测试如下:

    /// <summary>
    /// Ensures that a password must meet the password complexity of a digit and an alphanumeric, 8 digits long and one
    /// special character.
    /// </summary>
    [TestMethod]
    public void TestPasswordComplexity()
    {
        var result = _UserManager.ChangePasswordAsync(_TestUser.Id, "Password123!", "1!").Result; //Changes the password.

        Assert.IsFalse(result.Succeeded);

        result = _UserManager.ChangePasswordAsync(_TestUser.Id, "Password123!", "123456789").Result; //Changes the password.

        Assert.IsFalse(result.Succeeded);

        result = _UserManager.ChangePasswordAsync(_TestUser.Id, "Password123!", "123456789!").Result; //Changes the password.

        Assert.IsFalse(result.Succeeded);

        result = _UserManager.ChangePasswordAsync(_TestUser.Id, "Password123!", "abcdefghijk").Result; //Changes the password.

        Assert.IsFalse(result.Succeeded);

        result = _UserManager.ChangePasswordAsync(_TestUser.Id, "Password123!", "abcdefghijK1!").Result; //Changes the password.

        Assert.IsTrue(result.Succeeded);
    }  

或者你会把每个人分成单独的单元测试吗?

2 个答案:

答案 0 :(得分:2)

您可以添加数据行注释。

[TestMethod]
[DataRow ("1!")
[DataRow ("123456789")
[DataRow ("123456789!")
...
public void TestPasswordComplexity(string pass)
{
    var result = _UserManager.ChangePasswordAsync(_TestUser.Id, "Password123!", pass).Result; //Changes the password.

    Assert.IsFalse(result.Succeeded);
}

它将对通过pass参数传递的每个数据行运行测试方法。

为第五种Assert.IsTrue(result.Succeeded)案例创建单独的方法

答案 1 :(得分:1)

为每个测试编写一个单独的单元测试方法,其含义为全名。 因此,当测试失败后,您很容易发现问题是什么。

您必须区分不同的测试和不同的测试参数。 一些断言会失败,因为密码由于某种原因变弱,有些 应该通过。

对于您确实需要不同参数的情况,可以使用DataSource(请参阅http://msdn.microsoft.com/en-us/library/ms182527.aspx),您可以在其中添加外部源作为excel文件进​​行输入。

例如,您可以使用excel源测试传递密码。