单元测试多个断言

本文关键字:断言 单元测试 | 更新日期: 2023-09-27 18:26:47

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

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

单元测试多个断言

您可以添加数据行注释。

[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)案例创建一个单独的方法

为每个测试编写一个单独的单元测试方法,该方法具有完整的名称。因此,当以后测试失败时,你很容易发现问题出在哪里。

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

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

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