最近、完全に自動化された夜間のビルド/テスト/展開環境をセットアップする際に問題が発生しました。設定を簡単に説明します。Mercurial をソース管理システムとして、TeamCity をビルド サーバーとして使用します。現在、物事をシンプルに保つために、別のマシンに 1 つのビルド エージェントしかありません。
アイデアは次のとおりです。毎晩、TeamCity ビルドが実行されます。Mercurial リポジトリから最新のものを取得し、ビルドを実行し、単体テストを実行し、テスト サーバーにデプロイし、新しくデプロイされたテスト サーバーに対して (ビルド エージェントで) 受け入れテストを実行し、すべてが合格した場合は、ロットをステージング サーバーにデプロイします。受け入れテスト以外はすべて機能しています。これらは SpecFlow と WatiN で行われます。すべてが開発マシン (Windows 7 32 ビット) で問題なく動作します。ただし、受け入れテスト (TeamCity の NUnit) を実行しようとすると、ステップ [Browser].ContainsText(browserText) のためにランナー レポートが失敗します。それまでのすべての手順は正しく実行され、同じブラウザーでビルド エージェント (完全な管理者アクセス権を取得) で手順を複製すると、テキストが存在することがわかります。したがって、私の知る限り、テストは合格するはずです。
このスタックオーバーフロースレッドを見つけたので、ブラウザ インスタンスを維持する方法に問題があるのではないかと考えました。説明するには:「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(string text) メソッドは常に失敗します。ローカル デスクトップとの対話が有効になっています。
ビルド エージェント サービスをネットワーク管理者 (完全な管理者権限) として実行するように構成しました。このセットアップでは、テストも実行されません。私が得る例外:
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 で NUnit 2.0.5 を実行します。
誰もこの問題を抱えていましたか?