Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将代码重用添加到Selenium测试中?_Selenium_Selenium Rc - Fatal编程技术网

如何将代码重用添加到Selenium测试中?

如何将代码重用添加到Selenium测试中?,selenium,selenium-rc,Selenium,Selenium Rc,以下是我正在处理的情况: Selenium中的构建测试 正确运行所有测试(在Firefox中) 将所有测试导出到MSTest(以便每个测试都可以在IE、Chrome和FF中运行) 如果需要修改任何测试,请在Selenium IDE中进行编辑 所以这是一个非常单向的工作流程。不过,我现在想做一点自动化。例如,我希望每个测试都在两个帐户下运行。我遇到了一个维修问题。如果我想在两个帐户下运行6个测试,那么在Selenium IDE测试中突然需要12个测试。编辑太多了。但很多代码都是完全相同的 如何

以下是我正在处理的情况:

  • Selenium中的构建测试
  • 正确运行所有测试(在Firefox中)
  • 将所有测试导出到MSTest(以便每个测试都可以在IE、Chrome和FF中运行)
  • 如果需要修改任何测试,请在Selenium IDE中进行编辑
所以这是一个非常单向的工作流程。不过,我现在想做一点自动化。例如,我希望每个测试都在两个帐户下运行。我遇到了一个维修问题。如果我想在两个帐户下运行6个测试,那么在Selenium IDE测试中突然需要12个测试。编辑太多了。但很多代码都是完全相同的


如何在测试之间共享Selenium测试块?我是否应该第一次使用Selenium IDE开发测试,然后再也不使用它(之后只在VS中进行编辑)

从IDE导出Selenium代码后,它是非常线性的

例如(忽略语法):

这是登录页面。您的每个测试都必须使用它。你应该把它重构成一个方法

  someTestMethod(){
     selenium.open("http://someLoginPage.com");
     String username = "foo";
     String password = "bar";
     performLogin(username, password);
  }

  performLogin(String username, String password){
      selenium.type("usernameField", username);
      selenium.type("passwordField", password);
      selenium.click("loginButton");
      selenium.waitForPageToLoad("30000");
      assertTrue(selenium.isTextPresent("Welcome * foo"));
  }
performLogin()
方法不必与测试代码本身位于同一文件中。您可以使用方法为它创建一个单独的类,并在测试之间共享它

我们的类对应于UI上的某些功能。例如,我们有很多方法在我们的应用程序中搜索。帮助您实现搜索功能的所有方法都将位于SearchUtil类中

以类似方式组织测试将为您带来以下优势:

  • 如果用户界面发生变化(字段的id),您可以转到您的one方法,更新id,就可以继续了
  • 如果逻辑流程发生变化,您也只有一个地方可以更新
  • 要测试您的更改是否有效,您只需运行其中一个测试来验证。所有其他测试都使用相同的代码,因此应该可以工作
  • 当您查看代码时,会有更多的表达能力。使用命名良好的方法,可以创建更高级别的抽象,更易于阅读和理解
  • 灵活且可扩展可能性是无限的。在这一点上,您可以使用条件、循环、异常,您可以自己做报告,等等
是一个很好的资源,可以帮助你实现目标


祝你好运强>代码重用< /强>:

需要考虑的两个方面
  • 在您自己的代码库中消除代码重复——c_maker谈到了这一点
  • 从Selenium IDE生成的代码中消除代码重复
  • 我应该指出,我的评论在很大程度上倾向于您正在使用的单向工作流jcollum,但更重要的是:我使用IDE为给定的测试用例生成一次代码。我从不返回IDE修改测试用例并重新导出它。(当我想在代码中微调和定制测试用例(在我的例子中是C#)时,我会将IDE测试用例作为一个诊断工具放在身边

    我赞成将IDE测试仅作为起点的原因有:

    • IDE测试总是会有大量代码从一个测试复制到另一个测试,有时甚至是在一个测试中。这就是beast的本质
    • 在代码中,我可以使测试用例更“用户友好”,也就是说,我可以将神秘的定位器封装在有意义的命名属性或方法中,这样就可以更清楚地了解测试用例在做什么
    • 使用代码而不是IDE提供了更大的灵活性
    回到IDE生成的代码:它总是有大量的重复。例如:

    verifyText "//form[@id='aspnetForm']/div[2]/div/div[2]/div[1]/span" Home
    
    生成此代码块:

    try
    {
      Assert.AreEqual("Home",
        selenium.GetText("//form[@id='aspnetForm']/div[2]/div/div[2]/div[1]/span"));
    }
    catch (AssertionException e)
    {
      verificationErrors.Append(e.Message);
    }
    
    每个后续的verifyText命令都会生成一个相同的代码块,只是两个参数不同

    我对这种刺鼻的代码气味的解决方案是开发Selenium Sushi,这是一个Visual Studio C#项目模板和库,可以消除大部分(如果不是全部)重复。使用该库,我只需编写一行代码,以匹配IDE测试用例中的原始代码行:

    Verify.AreEqual("Home",
      selenium.GetText("//form[@id='aspnetForm']/div[2]/div/div[2]/div[1]/span"));
    

    2011年2月,我在Simple-Talk.com上发表了一篇内容广泛的文章,介绍了这一点。

    你也可以放一些片段或一行,例如

    note( "now on page: " .  $sel->get_location() . ", " . $sel->get_title() ; 
    
    进入IDE的“代码片段”集合(我使用Eclipse)


    这不是真正的重用,但它对我来说适用于一次性测试脚本或现有测试脚本的快速增强。

    真的吗?我不能让testA和testB使用相同的“远程控制”实例,或者换句话说,在测试之间使用相同的登录会话?真的吗?
    note( "now on page: " .  $sel->get_location() . ", " . $sel->get_title() ;