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) 倾向于集成测试类别,但没有人禁止为此使用单元测试框架。在这种情况下,可以对一些随机工作负载执行启动/停止,甚至多次这样做,以确保系统正常运行并完成工作。这显然是“长时间运行”的测试套件,您不需要在每次签入时都执行它。诀窍是将异步行为与逻辑分离。请注意,您的实际逻辑是同步的,而异步部分只是介于两者之间的一些“等待时间” 这本书描述得很好。这甚至是一种模式-。那里的解释比我能解释的好