如何从另一个线程中止单元测试?

Tza*_*ahi 5 c# multithreading unit-testing visual-studio-2010

我有基本运行2个线程的单元测试示例代码:主测试线程和我正在启动的另一个线程,应该在一段时间后导致测试执行失败(这基本上是一个超时线程)

代码如下:

[TestClass]
public class SomeTestClass
{
    [TestInitialize]
    public void BeforeTest()
    {
        var task = new Task(abortIfTestStilRunsAfterTimeout);
        task.Start();
    }

    [TestMethod]
    public void TestMethod()
    {
        Thread.Sleep(5000);
    }

    private void abortIfTestStilRunsAfterTimeout()
    {
        Assert.Fail("timeout passed!");

    }
}
Run Code Online (Sandbox Code Playgroud)

好吧,我原以为TestMethod()测试应该失败,但是实际上发生的是,运行该Assert.Fail方法的任务线程发生异常,而另一个线程继续运行并且测试通过。

我正在寻找一种无法通过测试方法的方法

Chr*_*Wue 3

您可以尝试获取对测试线程的引用并调用Abort()它。您可以传递一个异常状态对象,Abort()您可以使用该对象传递失败消息:

[TestClass]
public class SomeTestClass
{
    Thread testThread;

    [TestInitialize]
    public void BeforeTest()
    {
        testThread = Thread.CurrentThread;
        var task = new Task(abortIfTestStilRunsAfterTimeout);
        task.Start();
    }

    [TestMethod]
    public void TestMethod()
    {
        try
        {
            Thread.Sleep(5000);
        }
        catch (ThreadAbortException e)
        {
             Assert.Fail((string)e.ExceptionState);
        }
    }

    private void abortIfTestStilRunsAfterTimeout()
    {
        testThread.Abort("timeout passed!");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您不想修改大约 100 个测试,您可以使用 PostSharp 等工具通过在try {} catch {}每个测试用例周围插入逻辑来修改您的测试用例。归根结底就是编写一个属性并用它来装饰您的测试程序集(这称为面向方面编程,PostSharp 中的框架称为 Laos)。