7

我最近在设置全自动夜间构建/测试/部署环境时遇到了一些麻烦。简要说明设置。我们使用 Mercurial 作为源代码控制系统,使用 TeamCity 作为构建服务器。它目前在单独的机器上只有一个构建代理,以保持简单。

想法如下:每天晚上运行一个 TeamCity 构建。从 Mercurial 存储库中提取最新信息,运行构建,运行单元测试,部署到测试服务器,针对新部署的测试服务器运行验收测试(在构建代理上),如果所有这些都通过,则将批次部署到临时服务器。除了验收测试之外,我已经完成了所有工作。这些是通过 SpecFlow 和 WatiN 完成的。Everyhting 在开发机器(Windows 7 32 位)上运行良好。但是,当我尝试运行验收测试(TeamCity 中的 NUnit)时,由于步骤 [Browser].ContainsText(browserText),运行器报告失败。所有步骤都正确运行,如果我在构建代理上的同一浏览器中复制这些步骤(获得完全的管理员访问权限),我可以看到存在的文本。因此,据我所知,测试应该通过。

我发现这个stackoverflow 线程让我觉得我可能在保留浏览器实例的方式上做错了。解释一下:我有一组常见的步骤,例如“当我单击 X 按钮时”或“当我在字段 Y 中输入文本 X 时”和一个有问题的“然后我显示 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 直到测试完成,我错了吗?

到目前为止我已经尝试过:

  1. 将构建代理服务配置为作为本地系统 (SYSTEM) 运行。这会导致所描述的问题 - ThenIAmShown(string text) 方法将始终失败。它启用了与本地桌面的交互。

  2. 将构建代理服务配置为以网络管理员身份运行(完全管理员权限)。此设置甚至不会运行测试。我得到的例外:

    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) ...

  3. 已将程序集 Interop.SHDocVw.dll 和 Microsoft.mshtml.dll 添加到 bin 目录(项目引用中的复制到输出)。

  4. 从构建代理运行 NUnit UI。这将按预期运行单元测试。让我相信安全可能存在问题。在 Windows Server 2008 R2 Enterprise 上运行 NUnit 2.0.5。

有人有这个问题吗?

4

0 回答 0