C# 为什么我的测试在一起运行时失败,但单独通过?

C# 为什么我的测试在一起运行时失败,但单独通过?,c#,visual-studio-2010,selenium-ide,nunit-2.5,C#,Visual Studio 2010,Selenium Ide,Nunit 2.5,当我在VisualStudio中编写测试时,我会通过保存、构建测试并在Nunit中运行测试来检查它是否工作(右键单击测试,然后运行) 这个测试很有效。。。 所以我继续 现在,我已经编写了另一个测试,它的工作原理与我保存和测试它的方式相同,如上所述。但是,它们在一起运行时不起作用 以下是我的两个测试,它们在单独运行时有效,但在一起运行时失败: using System; using NUnit.Framework; using OpenQA.Selenium.Support.UI; using O

当我在VisualStudio中编写测试时,我会通过保存、构建测试并在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"));
        }
    }
}
有人知道为什么我的代码在一起运行时失败,但在单独运行时通过吗

任何答案都将不胜感激

查看和。

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

您确定在运行其中一个测试后,该方法

NavigateTo<LogonPage>().LogonAsCustomerAdministrator();
NavigateTo().LogonAsCustomerAdministrator();

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

有两件事可以尝试

  • 将断点放在以下两行之间。当第二行被点击时,看看你在哪一页
  • 通过Thread.Sleep在这两行之间引入一点延迟

    Driver.FindElement(By.Id(“子菜单项4”))。单击(); var headerelement=Driver.FindElement(By.ClassName(“header”)


  • 在不知道Selenium是如何工作的情况下,我打赌它是一个静态类,所以这两个测试共享状态。共享状态的一个示例是
    Driver.Url
    。因为测试是并行运行的,所以有一个竞争条件来设置此对象的状态


    也就是说,我没有为您提供解决方案:)

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


    看起来某个地方缺少测试同步。。。请注意,我的测试不是顺序依赖的,我没有任何静态成员或外部依赖。

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

    ->将登录置于设置方法中,或者(因为两个测试似乎使用相同的用户),甚至直到fixture设置 ->注销(如果需要)可采用拆除方法

         [SetUp]
         public void LaunchTest()
         {
            NavigateTo<LogonPage>().LogonAsCustomerAdministrator();
         }
    
         [TearDown]
         public void StopTest()
         {
            // logoff
         }
         [Test]
         public void Test1()
         {...}
         [Test]
         public void Test2()
         {...}
    

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

  • 如果您的被测系统具有静态字段/属性,这些字段/属性被用来计算您所断言的输出,则也可能发生这种情况
  • 如果被测系统是共享(静态)依赖项,则可能发生这种情况

  • 您确定测试没有共享状态吗?浏览器是否在测试之间关闭并重新打开?当它们一起运行时,哪个测试失败?是两个都失败了,还是一个通过了,一个失败了?浏览器会关闭,命令窗口也会关闭。。它们再次打开以处理以下测试。。。这是第一个通过的测试,随后所有的测试通常都会失败,并且它们都会因为上面发布的相同原因而失败。这对你的特定问题没有帮助,但是请注意,它会在后台运行你的测试。摆脱整个“保存、构建并运行测试”的麻烦。这种情况一直发生在我身上(尽管有不同的错误),尽管我的问题是访问数据库并在事务中运行每个测试。。我会遇到非线程安全的异常,因此在Visual Studio中运行时,下一个测试必须在上一个测试完成之前启动(运行命令行似乎没有相同的问题),很好地观察驱动程序在我的测试中的导航,它会加载所有页面并按预期导航到页面。以及我要显示的页面标题。它不喜欢将“Header元素”作为测试,因为它自己运行时通过了测试?您建议我可以在TestFixtureTearDown中清理哪些内容?@GraemesSecondWave遗憾的是,我不知道Selenium。但是,我知道,当我一起运行测试时,它们会失败,当我将公共指令添加到设置中时,它会工作。例如,如果添加
    NavigateTo().LogonAsCustomerAdministrator()到TestFixtureSetup?如果突出显示
    var headerelement…
    行,则可能是它前面的行引发了异常。确保子菜单项4存在。你试过调试它吗?(右键单击测试,选择test With->Debugger)在建议的位置尝试了thread.sleep函数。在添加它之前,当我运行测试时,总是第二个测试失败,但是使用sleep命令时,总是第二个测试失败,第一个测试失败?奇怪!因此,这可能意味着您需要在“header”元素查找器上方使用thread.sleep,以便在驱动器查找该元素之前,浏览器有足够的时间加载页面。在第一个测试中也尝试同样的方法。好的,我在两个测试中都添加了sleep函数,它们都通过了!奇怪的是,我以前试过,但从来没有把它们都加进去。。不知道为什么他们现在通过了,但我更不高兴了!感谢您的帮助。thread.sleep可能不是“为什么会发生这种情况”问题的答案。我使用selenium驱动程序进行基于css的菜单单击的经验是不可预测的。睡眠似乎是我能够可靠地处理那些点击+1的唯一方法,因为你让我意识到我的静态对象是我错误的问题和原因。非常感谢。我在.net core中的InMemory数据库中遇到了这种情况--只是不确定如何修复它以避免此问题,并且从可读性角度确保测试是自包含的,我通常不依赖单元测试之间的共享对象。我在每个单元测试中创建单独的对象。您可以使用不同的方法来创建不同的对象(以避免一次又一次地重写相同的代码)
         [SetUp]
         public void LaunchTest()
         {
            NavigateTo<LogonPage>().LogonAsCustomerAdministrator();
         }
    
         [TearDown]
         public void StopTest()
         {
            // logoff
         }
         [Test]
         public void Test1()
         {...}
         [Test]
         public void Test2()
         {...}
    
        var webDriverWait = new WebDriverWait(webDriver, ..);
        webDriverWait.Until(d => d.FindElement(By.CssSelector(".."))
            .Displayed))