簡體   English   中英

為什么我的測試一起運行時失敗,但單獨通過?

[英]Why do my tests fail when run together, but pass individually?

當我在 Visual Studio 中編寫測試時,我通過保存、構建然后在 Nunit 中運行測試來檢查它是否有效(右鍵單擊測試然后運行)。

測試有效...所以我繼續...

現在我已經編寫了另一個測試,它可以像上面一樣保存和測試它。 但是,當它們一起運行時,它們不起作用。

這是我的兩個測試,它們在單獨運行時有效,但在一起運行時失敗:

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"));
        }
    }
}

當第二個測試因為它們一起運行而失敗時

Nunit 介紹了這一點:

Sse.Bec.Web.Tests.Fixtures.ManageSitesAndUsers.ChangeOfPremises.AdminNavigateToChangeOfPremises.AdminNavigateToPageChangeOfPremisesViaMenu:OpenQA.Selenium.NoSuchElementException:找不到元素

此行突出顯示:

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

有誰知道為什么我的代碼一起運行時失敗,但單獨運行時通過?

任何答案將不勝感激!

當單元測試以某種方式使用共享資源/數據時,通常會發生這種情況。

  1. 如果您的被測系統具有用於計算您斷言的輸出的靜態字段/屬性,也會發生這種情況。
  2. 如果被測系統正在共享(靜態)依賴項,則可能會發生這種情況。

如果以上答案都不適合您,我通過在失敗測試中的斷言之前添加Thread.Sleep(1)解決了這個問題......

看起來測試同步在某處丟失了......請注意,我的測試不依賴於順序,我沒有任何靜態成員或外部依賴。

你可以嘗試兩件事

  1. 將斷點放在以下兩行之間。 並在第二行被擊中時查看您在哪個頁面

  2. 通過 Thread.Sleep 在這兩行之間引入一點延遲

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

在不知道 Selenium 是如何工作的情況下,我的賭注是Driver ,它似乎是一個靜態類,所以 2 個測試共享狀態。 共享狀態的一個示例是Driver.Url 因為測試是並行運行的,所以有一個競爭條件來設置這個對象的狀態。

也就是說,我沒有適合你的解決方案:)

查看TestFixtureSetupSetupTestFixtureTearDownTearDown
這些屬性允許您設置一次測試環境,而不是每次測試一次。

我認為您需要確保您可以登錄進行第二次測試,這可能會失敗,因為您已經登錄了?

-> 將登錄放在設置方法中,或者(因為看起來你在兩個測試中使用相同的用戶)甚至到夾具設置-> 注銷(如果需要)可能會放在拆卸方法中

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

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

如果 DOM 有延遲而不是 thread.sleep,我建議結合條件使用 webdriver.wait。 睡眠可能在 80% 中起作用,而在其他情況下則不起作用。 等待輪詢直到達到更可靠且可讀的超時。 這是一個我通常如何處理的示例:

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

我意識到這是一個非常古老的問題,但我今天才遇到它,沒有一個答案能解決我的特殊情況。

使用 Selenium 和 NUnit 進行前端自動化測試。

對於我的情況,我在啟動時使用[OneTimeSetUp][OneTimeTearDown]試圖提高效率。

然而,這存在使用共享資源的問題,在我的情況下是驅動程序本身和我用來驗證/獲取元素的助手。

也許是一個奇怪的邊緣案例——但我花了幾個小時才弄清楚。

您確定在運行其中一項測試后該方法

NavigateTo<LogonPage>().LogonAsCustomerAdministrator();

是帶你回到你應該去的地方嗎? 失敗似乎是由於導航處理程序不當造成的(假設在兩個測試中都存在並找到了 header 元素)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM