我正在努力编写一个能够测试使用BackgroundWorker线程的C#应用程序的工具。任何帮助将不胜感激!
我正在编写fixture以使用FitNesse (v20150814)和Fitsharp (v2.2.4498.25493)测试多线程C#应用程序(。NETv4)
在ViewModel中,后台工作程序的设置如下:
_backgroundWorker = workerFactory.GetBackgroundWorker();
_backgroundWorker.ProgressChangedEventHandler = BackgroundWorkerProgressChanged;
_backgroundWorker.DoWorkEventHandler = BackgroundWorkerDoWork;
_backgroundWorker.RunWorkerCompletedEventHandler = BackgroundWorkerRunWorkerCompleted;
然后,在用户交互过程中,工作人员开始:
_backgroundWorker.Run(args);
在交互模式下,此工作正常,事件处理程序按预期调用。
然而,当我使用FitNesse夹具启动Run()命令时,只按预期调用DoWorkEventHandler。
其他处理程序(ProgressChanged,RunWorkerCompleted)直到测试结束时才被调用,大概是FitSharp线程也在完成。
由于关键工作是其他处理程序的节点,我无法测试后台工作者的工作结果。
一位同事建议重新构建应用程序,以便所有工作都在DoWork事件处理程序中完成,并且可以工作,但我真的不想重新处理应用程序如果我可以避免它。
我分析了线程和调用堆栈,并绘制了一个图表来显示正在发生的事情。
问题是fitSharp测试模块打包并在之前完成在我的工作线程(最右边)上调用最终事件处理程序。
序列图基于this thread information信息。 我可以根据要求发布更多详细信息,并为线程图像中的填空道歉,但我只能发布2个链接......
答案 0 :(得分:0)
您需要某种方式告诉fitSharp
等待后台工作人员完成后再继续测试脚本中的下一步。 wait until
关键字可以帮助您做到这一点。有关详细信息,请参阅http://fitsharp.github.io/Fit/WaitUntilKeyword.html。您需要一种可以检测后台工作者何时完成的fixture方法。
e.g。
|myfixture|
|start worker|
|wait until|worker finished|true|
|check|some result|expected|
(wait until
版本2.3)中添加了fitSharp