为什么我的测试在一起运行时失败,但是单独传递?
当我在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().LogonAsCustomerAdministrator(); NavigateTo(); 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().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"));
有没有人知道为什么我的代码在一起运行时失败,但在单独运行时通过?
任何答案将不胜感激!
你可以尝试两件事
- 把断点放在以下两行之间。 当第二行被击中时,看看你在哪个页面
-
通过Thread.Sleep在这两行之间引入一点延迟
。Driver.FindElement(By.Id( “submenuitem4”))点击(); var headerelement = Driver.FindElement(By.ClassName(“header”));
查看TestFixtureSetup , Setup , TestFixtureTearDown和TearDown 。
这些属性允许您设置一次测试环境,而不是每次测试一次。
在不知道Selenium是如何工作的情况下,我的赌注是Driver
,它似乎是一个静态类,因此2个测试是共享状态。 共享状态的一个示例是Driver.Url
。 由于测试是并行运行的,因此存在设置此对象状态的竞争条件。
那就是说,我没有你的解决方案:)
当unit testing以某种方式使用共享资源/数据时,通常会发生这种情况。
- 如果您所测试的系统具有静态字段/属性,而这些字段/属性正在用于计算您声明的输出,则也会发生这种情况。
- 如果被测系统是共享(静态)依赖项,则可能发生这种情况。
如果上面的答案都不适合你,我通过在失败的测试中断言之前添加Thread.Sleep(1)
来解决这个问题…
看起来在某处错过了测试同步…请注意我的测试不依赖于顺序,我没有任何静态成员也没有外部依赖。
你确定在运行其中一个测试后的方法
NavigateTo().LogonAsCustomerAdministrator();
带你回到你应该去的地方? 似乎失败是由于不正确的导航处理程序(假设在两个测试中都存在并找到了header元素)。
我认为您需要确保,您可以登录进行第二次测试,这可能会失败,因为您已经登录了吗?
– >将登录设置为一个设置方法或(因为看起来你使用相同的用户进行两个测试)甚至直到夹具设置 – >注销(如果需要)可能会放入拆卸方法
[SetUp] public void LaunchTest() { NavigateTo().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))
- 从Windows窗体中的相对路径加载图像
- 为什么((IList )数组).ReadOnly = True但是((IList)数组).ReadOnly = False?
- 从Windows服务调用异步方法
- EntityFramework包版本=“6.1.3”和Web配置版本6.0.0.0?
- 使用现有数据库的ServiceStack身份validation
- 如何从调用方法的InvocationExpressionSyntax节点获取IMethodSymbol或方法声明的语法节点?
- 返回的数据类型因表中的数据而异
- 如何使用BackgroundWorker事件RunWorkerCompleted
- 从app.config文件读取值时出现问题