如何对任务并行性进行单元测试

时间:2012-05-25 10:45:53

标签: c# .net unit-testing task-parallel-library vs-unit-testing-framework

我在.NET中有一个类,它创建并启动一个新的System.Threading.Tasks.Task,如下所示:

public class ScheduledTask
{
    private IFoo _foo;

    public ScheduledTask(IFoo foo)
    {
        _foo = foo;
    }

    public void Start()
    {           
        _task = new Task(() => Run());
        _task.Start();
    }

    public void Stop(TimeSpan timeout)
    {
        var taskCompletedNormally = _task.Wait(timeout);
        if (taskCompletedNormally)
        {                
            _task.Dispose();
            _task = null;                
        }
    }

    private void Run(){ // Do some work}
}

如何对C#.Net中的ScheduledTask.StartScheduledTask.Stop方法进行单元测试?哪些是可用于此类单元测试的框架,哪些是单元测试线程(或任务并行)的最佳实践?

2 个答案:

答案 0 :(得分:5)

你的班级做得很多。启动/停止是一个通用函数,应该在它自己的类中。

public class StartStopTask
{
    private readonly Action _action;

    public StartStopTask(Action action)
    {
        _action = action;
    }

    public void Start()
    {           
        _task = new Task(_action);
        _task.Start();
    }
    ...
}

这门课很容易进行单元测试。

bool worked = false;
var startstop = new StartStopTask(() => { worked = true });
startstop.Start();
startstop.Stop(new TimeSpan(0,0,0,10));
Assert.That(worked, Is.True);

然后您的其他类使用StartStopTask来完成其工作。

导出

public class ScheduledTask : StartStopTask
{
    private IFoo _foo;

    public ScheduledTask(IFoo foo)
        : base(() => Run())
    {
        _foo = foo;
    }

    private void Run(){ // Do some work }
}

或者只是委派工作

public class ScheduledTask
{
    private IFoo _foo;
    private readonly StartStopTask _startstop;

    public ScheduledTask(IFoo foo)
    {
        _foo = foo;
        _startstop = new StartStopTask(() => Run());
    }

    public void Start()
    {           
        _startstop.Start();
    }

    public void Stop(TimeSpan timeout)
    {
        _startstop.Stop(timeout);
    }

    private void Run(){ // Do some work }
}

更好的方法是让Run成为一个公共方法,让调用者决定如何运行它。

答案 1 :(得分:0)

您可以尝试使用模拟任务。

最好!