如何对任务parellelism进行单元测试

Kun*_*hah 4 .net c# 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}
}
Run Code Online (Sandbox Code Playgroud)

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

adr*_*anm 5

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

public class StartStopTask
{
    private readonly Action _action;

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

    public void Start()
    {           
        _task = new Task(_action);
        _task.Start();
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

这个类很容易进行单元测试.

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

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

要么得出

public class ScheduledTask : StartStopTask
{
    private IFoo _foo;

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

    private void Run(){ // Do some work }
}
Run Code Online (Sandbox Code Playgroud)

或者只是委派工作

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 Code Online (Sandbox Code Playgroud)

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