1

我正在努力编写一个夹具来测试使用 BackgroundWorker 线程的 C# 应用程序。任何帮助将非常感激!

细节

我正在编写夹具以使用 FitNesse (v20150814)和 Fitsharp (v2.2.4498.25493)测试多线程 C# 应用程序( .NETv4) 。

在 ViewModel 中,后台工作人员设置如下:

        _backgroundWorker = workerFactory.GetBackgroundWorker();
        _backgroundWorker.ProgressChangedEventHandler = BackgroundWorkerProgressChanged;
        _backgroundWorker.DoWorkEventHandler = BackgroundWorkerDoWork;
        _backgroundWorker.RunWorkerCompletedEventHandler = BackgroundWorkerRunWorkerCompleted;

然后,在用户交互期间,worker 被启动:

        _backgroundWorker.Run(args);

在交互模式下,这工作正常,事件处理程序按预期调用。

但是,当我使用 FitNesse 夹具启动 Run() 命令时,只会按预期调用 DoWorkEventHandler。

直到测试结束时才会调用其他处理程序(ProgressChanged、RunWorkerCompleted),此时可能 FitSharp 线程也正在完成。

由于关键工作是其他处理程序的节点,因此我无法测试后台工作人员的工作结果。

一位同事建议重新构建应用程序,以便所有工作都在 DoWork 事件处理程序中完成,这样可以工作,但如果可以避免的话,我真的不想重新设计应用程序。


附加信息

我分析了线程和调用堆栈,并绘制了一个图表来显示正在发生的事情。

问题是 fitSharp 测试模块在我的工作线程(最右侧)上调用最终事件处理程序之前已打包并完成。

序列图

序列图就是基于这个线程信息信息。如果需要,我可以发布更多详细信息,并为线程图像中的死记硬背道歉,但我只能发布 2 个链接...

4

1 回答 1

0

您需要通过某种方式告诉fitSharp您等到后台工作人员完成后再继续测试脚本中的下一步。wait until关键字可以帮助做到这一点。有关详细信息,请参阅http://fitsharp.github.io/Fit/WaitUntilKeyword.html。您将需要一个可以检测后台工作人员何时完成的夹具方法。例如

|myfixture|
|start worker|
|wait until|worker finished|true|
|check|some result|expected|

wait untilfitSharp2.3 版本中添加)

于 2016-01-12T04:38:13.597 回答