web-dev-qa-db-ja.com

一緒に実行するとテストが失敗するのに、個別に合格するのはなぜですか?

Visual Studioでテストを作成するときは、Nunitでテストを保存、ビルド、実行して動作することを確認します(テストを右クリックして実行します)。

テストはうまくいきます...だから私は先に進みます...

今、私は別のテストを書きました、そしてそれは私が上記のようにそれを保存してテストしたように動作します。しかし、一緒に実行すると機能しません。

個人として実行すると機能するが、一緒に実行すると失敗する2つのテストを次に示します。

using System;
using NUnit.Framework;
using OpenQA.Selenium.Support.UI;
using OpenQA.Selenium;

namespace Fixtures.Users.Page1
{
    [TestFixture]
    public class AdminNavigateToPage1 : SeleniumTestBase
    {
        [Test]
        public void AdminNavigateToPage1()
        {
            NavigateTo<LogonPage>().LogonAsCustomerAdministrator();
            NavigateTo<Page1>();
            var headerelement = Driver.FindElement(By.ClassName("header"));

            Assert.That(headerelement.Text, Is.EqualTo("Page Title"));
            Assert.That(Driver.Url, Is.EqualTo("http://localhost/Page Title"));
        }

        [Test]
        public void AdminNavigateToPage1ViaMenu()
        {
            NavigateTo<LogonPage>().LogonAsCustomerAdministrator();
            Driver.FindElement(By.Id("menuitem1")).Click();
            Driver.FindElement(By.Id("submenuitem4")).Click();
            var headerelement = Driver.FindElement(By.ClassName("header"));

            Assert.That(headerelement.Text, Is.EqualTo("Page Title"));
            Assert.That(Driver.Url, Is.EqualTo("http://localhost/Page Title"));
        }
    }
}

一緒に実行されたために2番目のテストが失敗した場合

Nunitはこれを提示します:

Sse.Bec.Web.Tests.Fixtures.ManageSitesAndUsers.ChangeOfPremises.AdminNavigateToChangeOfPremises.AdminNavigateToPageChangeOfPremisesViaMenu:OpenQA.Selenium.NoSuchElementException:要素が見つかりませんでした

そしてこの行は強調表示されています:

var headerelement = Driver.FindElement(By.ClassName("header"));

一緒に実行するとコードが失敗するのに、単独で実行すると成功する理由を誰かが知っていますか?

どんな答えでも大歓迎です!

19

あなたが試すことができる2つのこと

  1. 次の2行の間にブレークポイントを置きます。そして、2行目がヒットしたときにどのページにいるのかを確認します
  2. Thread.Sleepを介して、これら2つの行の間にわずかな遅延を導入します

    Driver.FindElement(By.Id( "submenuitem4"))。Click(); var headerelement = Driver.FindElement(By.ClassName( "header"));

1
chandmk

このような状況は通常、単体テストが何らかの方法で共有リソース/データを使用している場合に発生します。

  1. また、テスト対象のシステムに、アサートしている出力を計算するために利用されている静的フィールド/プロパティがある場合にも発生する可能性があります。
  2. テスト対象のシステムが共有(静的)依存関係にある場合に発生する可能性があります。
4
user3613932

TestFixtureSetupSetupTestFixtureTearDown および TearDown を調べます。
これらの属性を使用すると、テストごとに1回ではなく、1回だけテスト環境をセットアップできます。

2
Default

Seleniumがどのように機能するかを知らずに、私の賭けはDriverにあります。これは静的クラスのようであるため、2つのテストは状態を共有しています。共有状態の一例はDriver.Url。テストは並行して実行されるため、このオブジェクトの状態を設定するための競合状態があります。

そうは言っても、私にはあなたのための解決策がありません:)

2
Jodi

上記の答えのどれもうまくいかなかった場合、失敗したテストのアサーションの前にThread.Sleep(1)を追加することでこの問題を解決しました...

テストの同期がどこかで見落とされているようです...私のテストは順序に依存しておらず、静的メンバーも外部依存もありません。

1
Loul G.

テストの1つを実行した後、メソッドが

NavigateTo<LogonPage>().LogonAsCustomerAdministrator();

あなたを本来あるべき場所に連れ戻していますか?失敗は不適切なナビゲーションハンドラーが原因であるように思われます(ヘッダー要素が存在し、両方のテストで見つかったと仮定します)。

0
casals

2番目のテストにログオンできることを確認する必要があると思います。すでにログオンしているため、失敗する可能性がありますか?

->ログオンをセットアップ方法または(両方のテストで同じユーザーを使用しているように見えるため)フィクスチャセットアップ->ログオフ(必要に応じて)分解方法に入れることができます

     [SetUp]
     public void LaunchTest()
     {
        NavigateTo<LogonPage>().LogonAsCustomerAdministrator();
     }

     [TearDown]
     public void StopTest()
     {
        // logoff
     }
     [Test]
     public void Test1()
     {...}
     [Test]
     public void Test2()
     {...}

Thread.sleepの代わりにDOMに遅延がある場合は、条件と組み合わせてwebdriver.waitを使用することをお勧めします。睡眠は80%で機能し、他の場合は機能しない可能性があります。待機は、より信頼性が高く、読みやすいタイムアウトに達するまでポーリングします。これが私が通常これにアプローチする方法の例です:

    var webDriverWait = new WebDriverWait(webDriver, ..);
    webDriverWait.Until(d => d.FindElement(By.CssSelector(".."))
        .Displayed))
0
Marc Sputnik