Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单元测试线程?_C#_Multithreading_Unit Testing - Fatal编程技术网

C# 单元测试线程?

C# 单元测试线程?,c#,multithreading,unit-testing,C#,Multithreading,Unit Testing,我只需要对一些方法进行单元测试,比如: public void start() { myThread.Start(); } public void stop() { myThread.Abort(); } 我该怎么做?我可以调用start方法并检查IsAlive==true,但线程会在后台继续工作并调用自己的方法。另一种方法是我调用start,然后立即停止,但这并不整洁,因为这就像我在测试两个东西。这很简单,但是啊 使用线程同步和等待句柄等待正在运行的线程 为什么需要对这些方

我只需要对一些方法进行单元测试,比如:

public void start()
{
    myThread.Start();
}

public void stop()
{
    myThread.Abort();
}

我该怎么做?我可以调用start方法并检查IsAlive==true,但线程会在后台继续工作并调用自己的方法。另一种方法是我调用start,然后立即停止,但这并不整洁,因为这就像我在测试两个东西。这很简单,但是啊

使用
线程同步
等待句柄
等待正在运行的线程


为什么需要对这些方法进行单元测试?你想验证什么?如果您试图验证的内容不正确,其他测试是否会中断?(即,是否包含在其他测试中?)


如果没有,您可以进入信号量,让您的单元测试确保线程在给定的超时之前启动,但我只是不认为它最终是一个非常有价值的测试。这不会增加我的信心。

为了测试的目的,将依赖于时间的事情同步是个好主意。(事实上,即使在非测试使用中,本地化依赖于时间的交互也是一个好主意。)

如果您真的只想检查这些方法是否启动和停止线程,我将插入一个虚拟对象
myThread
,该对象提供这些方法,但实际上并不启动线程,或者插入一个线程,该线程的代码将只是坐在那里等待,而不做任何事情。然后,您可以记录它的启动和停止,而不必担心实际线程的复杂性


也许您的情况比仅仅检查线程是否启动更复杂?如果您发布了一个稍大一点的示例,说明您想要测试的类型,这可能会有所帮助。

我同意BnWasteland的观点,即对于给定的代码示例,唯一可以测试的是System.Threading.Thread.Start和System.Threading.Thread.Abort工作正常。所以,我们可以合理地假设它们是并专注于应用程序自己的代码。然后您有两个域:

1) 在线程内执行的实际任务的代码。这可以在正常的单元测试中进行测试

2) 确保多线程基础结构按预期工作


(2) 倾向于集成测试类别,但没有人禁止为此使用单元测试框架。在这种情况下,可以对一些随机工作负载执行启动/停止,甚至多次这样做,以确保系统正常运行并完成工作。这显然是“长时间运行”的测试套件,您不需要在每次签入时都执行它。

诀窍是将异步行为与逻辑分离。请注意,您的实际逻辑是同步的,而异步部分只是介于两者之间的一些“等待时间”

这本书描述得很好。这甚至是一种模式-。那里的解释比我能解释的好