我最近在设置全自动夜间构建/测试/部署环境时遇到了一些麻烦。简要解释一下设置。我们使用Mercurial作为源控制系统,使用TeamCity作为构建服务器。它目前在一台单独的机器上只有一个构建代理,以保持简单。
这个想法如下:每晚都会运行一个TeamCity构建。从Mercurial存储库中提取最新信息,运行构建,运行单元测试,部署到测试服务器,针对新部署的测试服务器运行验收测试(在构建代理上),如果所有这些通过将批次部署到临时服务器。除了验收测试之外,我已经完成了所有工作。这些都是使用SpecFlow和WatiN完成的。 Everyhting在开发机器上运行良好(Windows 7 32位)。但是,当我尝试运行验收测试(TeamCity中的NUnit)时,运行器报告失败,因为步骤[浏览器] .ContainsText(browserText)。所有步骤都正确运行,如果我在构建代理上的同一浏览器中复制步骤(获得完全管理员访问权限),我可以看到文本存在。所以据我所知,测试应该通过。
我发现这个stackoverflow thread让我觉得我可能会对我如何保持浏览器实例做错。解释一下:我有一套常见的步骤,例如“当我点击X按钮时”或“当我将文字X输入字段Y时”和有问题的那个“然后我显示X”。因为我正在尽可能多地重复使用测试,所以我也推广了一个@requires_browser场景要求,然后定义如下:
[BeforeScenario("requires_browser")]
public void RequiresBrowserBeforeFeature()
{
Settings.MakeNewIeInstanceVisible = false;
ScenarioContext.Current.Set<Browser>(new IE(true));
}
[AfterScenario("requires_browser")]
public void RequiresBrowserAfterFeature()
{
ScenarioContext.Current.Get<Browser>().Close();
ScenarioContext.Current.Get<Browser>().Dispose();
}
然后是共同的步骤:
[Then("I am shown \"(.*)\"")]
public void ThenIAmShown(string text)
{
Assert.IsTrue(ScenarioContext.Current.Get<Browser>().ContainsText(text));
}
由此我可以定义其他常见步骤,将文本输入文本框,单击按钮等。所有这一切都完美适用于开发环境,在visual studio 2010 [以管理员身份]运行。
我认为在测试结束之前应该保留ScenarioContext是错误的吗?
到目前为止我尝试过:
配置构建代理服务以作为本地系统(SYSTEM)运行。这导致了所描述的问题 - ThenIAmShown(字符串文本)方法将始终失败。它与已启用本地桌面的交互。
配置的构建代理服务以网络管理员身份运行(完全管理员权限)。此设置甚至不会运行测试。我得到的例外:
TearDown方法失败。 WatiN.Core.Exceptions.BrowserNotFoundException:找不到匹配约束的IE窗口:等待附加到新创建的IE实例时超时。搜索在“30”秒后过期。 TearDown:System.Collections.Generic.KeyNotFoundException:给定的键不在字典中。 在WatiN.Core.IE.CreateIEPartiallyInitializedInNewProcess() 在WatiN.Core.IE.CreateNewIEAndGoToUri(Uri uri,IDialogHandler logonDialogHandler,Boolean createInNewProcess) ...
已将程序集Interop.SHDocVw.dll和Microsoft.mshtml.dll添加到bin目录(在项目引用中复制到输出)。
从构建代理运行NUnit UI。这按预期运行单元测试。让我相信可能存在安全问题。 Windows Server 2008 R2 Enterprise上的Runnint NUnit 2.0.5。
有人有这个问题吗?