为什么我的测试在一起运行时失败,但是单独传递?

时间:2012-01-24 13:00:09

标签: c# visual-studio-2010 selenium-ide nunit-2.5

当我在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"));

有人知道为什么我的代码在一起运行时会失败,但在单独运行时会通过吗?

任何答案都将不胜感激!

7 个答案:

答案 0 :(得分:3)

当单元测试以某种方式使用共享资源/数据时,通常会发生这种情况。

  1. 如果您所测试的系统具有静态字段/属性,而这些字段/属性正在用于计算您声明的输出,也会发生这种情况。
  2. 如果被测系统是共享(静态)依赖项,可能会发生这种情况。

答案 1 :(得分:2)

查看TestFixtureSetupSetupTestFixtureTearDownTearDown
这些属性允许您设置一次测试环境,而不是每次测试一次。

答案 2 :(得分:2)

在不知道Selenium是如何工作的情况下,我的赌注是Driver,这似乎是一个静态类,所以2个测试是共享状态。共享状态的一个示例是Driver.Url。由于测试是并行运行的,因此存在设置此对象状态的竞争条件。

那就是说,我没有你的解决方案:)

答案 3 :(得分:1)

你可以尝试两件事

  1. 将断点放在以下两行之间。并且在第二行被点击时查看您所在的页面
  2. 通过Thread.Sleep

    在这两行之间引入一点延迟 。

    Driver.FindElement(By.Id( “submenuitem4”))点击(); var headerelement = Driver.FindElement(By.ClassName(“header”));

答案 4 :(得分:1)

如果上述答案都不适合您,我通过在失败测试中断言之前添加Thread.Sleep(1)来解决此问题...

看起来在某处错过了测试同步...请注意我的测试不依赖于顺序,我没有任何静态成员也没有外部依赖。

答案 5 :(得分:0)

你确定在运行其中一个测试后的方法

NavigateTo<LogonPage>().LogonAsCustomerAdministrator();

带你回到你应该去的地方?似乎失败是由于导航处理程序不正确(假设在两个测试中都存在头元素)。

答案 6 :(得分:0)

我认为您需要确保您可以登录进行第二次测试,这可能会失败,因为您已经登录了吗?

- &GT;将登录设置为设置方法或(因为看起来您在两个测试中使用相同的用户)甚至直到夹具设置 - &GT;注销(如果需要)可能会被放入拆除方法

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