运行全部运行时单位测试失败,但是在单独运行时通过



我有大约12个针对不同方案的单元测试,我需要在这些测试中调用一种异步方法(有时在一个测试中多次)。当我"全部运行"时,其中3个总是会失败。如果我使用"运行选定的测试"一个人运行它们,它们将通过。我得到的输出的例外是:

system.AppDomainunloadedException:尝试访问卸载 AppDomain。如果测试开始线程,但没有 停下来。确保测试开始的所有线程都是 在完成前停止。

我无法真正共享代码,因为它很大,我不知道从哪里开始,所以这里是示例:

[TestMethod]
public async Task SampleTest()
{
    var someProvider = new SomeProvider();
    var result = await someProvider.IsSomethingValid();
    Assert.IsTrue(result == SomeProvider.Status.Valid);
    NetworkController.Disable();
    result = await someProvider.IsSomethingValid();
    Assert.IsTrue(result == SomeProvider.Status.Valid);
    NetworkController.Enable();
}

编辑:其他两个失败的方法分别为未来和过去设定了时间。

[TestMethod]
public async Task SetTimeToFutureTest()
{
    var someProvider = new SomeProvider();
    var today = TimeProvider.UtcNow().Date;
    var result = await someProvider.IsSomethingValid();
    Assert.IsTrue(result == SomeProvider.Status.Valid);
    TimeProvider.SetDateTime(today.AddYears(1));
    var result2 = await someProvider.IsSomethingValid();
    Assert.IsTrue(result2 == SomeProvider.Status.Expired);
}

TimeProvider看起来像这样:

public static class TimeProvider
{
    /// <summary> Normally this is a pass-through to DateTime.Now, but it can be overridden with SetDateTime( .. ) for testing or debugging.
    /// </summary>
    public static Func<DateTime> UtcNow = () => DateTime.UtcNow;
    /// <summary> Set time to return when SystemTime.UtcNow() is called.
    /// </summary>
    public static void SetDateTime(DateTime newDateTime)
    {
        UtcNow = () => newDateTime;
    }
    public static void ResetDateTime()
    {
        UtcNow = () => DateTime.UtcNow;
    }
}

编辑2:

    [TestCleanup]
    public void TestCleanup()
    {
        TimeProvider.ResetDateTime();
    }

其他方法相似,我将模拟时间/日期更改,等等。

我尝试通过从中拿出.result()等来同步调用该方法,但这无济于事。我在网上阅读了有关此的材料,但仍在挣扎。

有人遇到了同样的问题吗?任何技巧都将不胜感激。

我看不到您在测试初始化或清理工作,但可能是因为所有测试方法都在尝试异步运行,所以测试跑者不允许进行清理之前,要完成的所有任务。

运行所有测试时,相同的几种方法是失败的还是随机的?您确定您正在进行单元测试而不是集成测试吗?类的" NetworkController"给了我一个印象,即您可能会进行更多的集成测试。如果是这种情况,并且您正在使用普通类,提供商,服务或存储介质(数据库,文件系统),则由一种方法引起的交互或状态更改可能会影响另一种测试方法的功效。

在异步/等待模式下运行测试时,您会产生一些滞后。看来您的所有处理都在记忆中发生。因为滞后时间很小,他们可能会一对一地通过一个基础。在异步模式下运行多个多次时,滞后时间足以在时间上引起分化。

在进行Ncrunch进行的Nunit测试之前,我已经遇到了这一点,在该测试中正在测试DateTime组件。您可以通过减少验证/到期逻辑的范围以匹配第二而不是毫秒,只要您在接受标准中允许使用,就可以减轻这种情况。我无法从您的代码中分辨出逻辑正在驱动验证状态或到期日期,但是我愿意敢打赌,同步运行时,异步滞后是测试失败的根本原因。

所示的两个测试都使用相同的静态时间表,因此在清理和timeProvider.setdateTime中诸如resetDateTime之类的方法干扰(today.addyears(1));在测试中可以预期。另外,网络控制器似乎是静态资源,连接/断开连接可能会干扰您的测试。

您可以通过多种方式解决问题:

  • 摆脱静态资源,使用实例
  • 锁定测试,以便一次只能进行一次测试

除此之外,几乎每个测试框架都提供的不仅仅是断言。您的框架不提供assert.areequal吗?这改善了重读。另外,在测试中有多个断言的情况下,定制消息指示哪些测试失败(或者建议是预先条件,而不是实际的测试)。

相关内容

最新更新