我使用Project White为我的应用程序编写了一个简单的 UI 自动化测试。它只是启动应用程序并检查主窗口是否存在。这是在 NUnit 测试的上下文中完成的:
///AppTest.cs
[Test]
public void ShouldDisplayMainForm() {
using( var wrapper = new WhiteWrapper( MYAPP_PATH ) ){
Window win = wrapper.GetWindow( "MYAPP_MAIN_FORM_TITLE" );
Assert.IsNotNull(win);
}
}
///WhiteWrapper.cs
using System;
using White.Core;
using White.Core.Factory;
using White.Core.UIItems;
using White.Core.UIItems.WindowItems;
namespace MGClient.Test {
internal class WhiteWrapper : IDisposable {
private readonly Application mHost;
private readonly Window mMainWindow;
public WhiteWrapper( string pPath ) {
mHost = Application.Launch( pPath );
}
public WhiteWrapper( string pPath, string pMainWindowTitle )
: this( pPath ) {
mMainWindow = GetWindow( pMainWindowTitle );
}
public void Dispose() {
if( mHost != null )
mHost.Kill();
}
public Window GetWindow( string pTitle ) {
return mHost.GetWindow( pTitle, InitializeOption.NoCache );
}
public TControl GetControl<TControl>( string pControlName ) where TControl : UIItem {
return mMainWindow.Get<TControl>( pControlName );
}
}
}
问题是测试结果是随机的:有时失败,有时成功,没有遵循规律。
测试环境设置为初始化失败:我希望看到测试始终失败。问题是我的应用程序的主窗体在其Load
事件的处理程序中执行其初始化和所有相关验证。我认为存在竞争条件,因为 White 在单独的进程中运行被测应用程序:
在GetWindow
检测到初始化失败之前调用时,测试成功。当故障检测赢得比赛时,它会关闭应用程序,因此这会GetWindow
导致失败。
我正在查看 White 文档并浏览示例,但我找不到这种情况的解决方法。更改应用程序的代码应该是最后的手段,因为我还没有测试工具(这就是让我陷入困境的原因:我所有的想法都围绕着更改应用程序)。