NUnit,Assert失败后是否可以继续执行测试?

cca*_*oni 33 .net nunit unit-testing

在包含一些断言的测试中,例如:

Assert.AreEqual(1,1);
Assert.AreEqual(2,1);
Assert.AreEqual(2,2);
Run Code Online (Sandbox Code Playgroud)

是否有可能让测试在某些时候失败后继续运行?在该示例中,第一个条件为真,第二个条件失败并且测试停止.我还要评估以下条件.

Kon*_*rin 23

我更喜欢实用,并在一种方法中放入几个相关的断言.

我有一个辅助类,它启用以下语法(我使用):

AssertAll.Succeed(
    () => Assert.AreEqual("bb", id.Context),
    () => Assert.AreEqual("abc", id.FullName),
    () => Assert.AreEqual("b", id.SessionID));
Run Code Online (Sandbox Code Playgroud)

这给了我这样的错误信息:

Assert.AreEqual failed. Expected:<bb>. Actual:<b\c>. 
Assert.AreEqual failed. Expected:<abc>. Actual:<[b\c]a{103}>. 
at FXP_COM.Tests.EnumToStringConverterterTests.<>c__DisplayClass3.<ShouldConvert>b__0() in UnitTest1.cs: line 31
at FXP_COM.Tests.AssertAll.Succeed(Action[] assertions) in UnitTest1.cs: line 46 at FXP_COM.Tests.AssertAll.Succeed(Action[] assertions) in UnitTest1.cs: line 62
at FXP_COM.Tests.EnumToStringConverterterTests.ShouldConvert() in UnitTest1.cs: line 30
Run Code Online (Sandbox Code Playgroud)

辅助类如下:

using System;
using NUnit.Framework;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

public static class AssertAll
{
    public static void Succeed(params Action[] assertions)
    {
        var errors = new List<Exception>();

        foreach (var assertion in assertions)
            try
            {
                assertion();
            }
            catch (Exception ex)
            {
                errors.Add(ex);
            }

        if (errors.Any())
        {
            var ex = new AssertionException(
                string.Join(Environment.NewLine, errors.Select(e => e.Message)),
                errors.First());

            // Use stack trace from the first exception to ensure first
            // failed Assert is one click away
            ReplaceStackTrace(ex, errors.First().StackTrace);

            throw ex;
        }
    }

    static void ReplaceStackTrace(Exception exception, string stackTrace)
    {
        var remoteStackTraceString = typeof(Exception)
            .GetField("_remoteStackTraceString",
                BindingFlags.Instance | BindingFlags.NonPublic);

        remoteStackTraceString.SetValue(exception, stackTrace);
    }
}
Run Code Online (Sandbox Code Playgroud)


use*_*610 16

NUnit 3.6添加了Assert.Multiple方法和MultipleAsserts属性.

在此输入图像描述

请参阅https://github.com/nunit/docs/wiki/Multiple-Asserts.

  • 从这里的最后一条评论(https://github.com/nunit/nunit/issues/391)来看,这个功能似乎推迟到版本3.2,本月应该从Github里程碑做好准备但是,目前它不是截至目前. (2认同)

Car*_*ter 11

通常在这种情况下,您可以将断言上方的所有代码放入设置方法中,然后将每个断言写入自己的测试用例.

  • 或者使用[TestCase]. (3认同)

slv*_*ron 5

不,你不能单独使用NUnit.你必须做像@Konstantin Spirin这样的事情.我创建了一个可以使用的小扩展; 它被称为NUnit-GroupAssert.它可以在这里找到:https://github.com/slvnperron/NUnit-GroupAssert

如何使用它:

[Test]
public void Verify_GroupsExceptions()
{
    var group = new AssertGroup();
    group.Add(() => Assert.AreEqual(10, 20));
    group.Add(() => Assert.AreEqual(1, 1));
    group.Add(() => Assert.AreEqual(3, 4));
    group.Add(() => Assert.IsTrue(1 > 3));
    group.Verify();
}

// OR

public void Verify_GroupsExceptions()
{
    // Verifies on disposal
    using (var group = new AssertGroup())
    {
        group.Add(() => Assert.AreEqual(10, 20));
        group.Add(() => Assert.AreEqual(1, 1));
        group.Add(() => Assert.AreEqual(3, 4));
        group.Add(() => Assert.IsTrue(1 > 3));
    }
}
Run Code Online (Sandbox Code Playgroud)

它将输出:

测试失败,因为一个或多个断言失败:
1)预期:10
但是:20
来自第18行的Verify_GroupsExceptions

2)预期:3
但是:4
来自第20行的Verify_GroupsExceptions

3)预期:True
但是:False
来自第21行的Verify_GroupsExceptions