在不同的环境中执行Spock测试

时间:2015-02-25 13:48:47

标签: groovy spock

我有一个Selenium测试,它是在Spock框架的帮助下执行的。一般来说,它看起来像这样:

class SeleniumSpec extends Specification {
    URL remoteAddress // Address of SE grid
    Capabilities caps // Desired capabilities
    WebDriver driver  // Web driver

    def setup() {
        driver = new RemoteWebDriver(remoteAddress, caps)
    }
    def "some test" () {
        expect:
        driver.findElement(By.cssSelector("p.someParagraph")).text == 'Some text'
    }
    // other tests go here ...
}

这里的要点是,我的规范描述了某些组件的行为(在大多数情况下 - Web视图/页面)。因此,期望这些方法实现一些与业务相关的逻辑(如同点击按钮并期望在另一个字段中的消息);但另一件事,我想测试的是确保所有浏览器(功能)中的行为完全相同。

为了在“理想”世界中实现这一目标,我希望有一种机制来指定,应该多次使用特定的测试类,但是使用一些不同的参数。但就目前而言,我认为只能为单一方法应用数据集。

我只提出了几个实现这一点的想法(根据我目前对Spock框架的了解):

  1. 使用驱动程序列表并对所有列表成员执行每个操作。因此,对'driver'的每次调用都将替换为'drivers.each {it}'调用。另一方面,这种方法很难准确地发现哪些驾驶员未通过测试。
  2. 使用方法参数和数据集在每次迭代时启动Web驱动程序的新副本。根据Spock的理念,这种方法似乎更合乎逻辑,但它需要每次都执行大量的驱动程序和Web应用程序初始化操作。它还删除了执行“逐步”测试的能力,因为测试方法之间不会保留驱动程序状态。
  3. 这些方法的组合,当驱动程序保存在地图中时,每个测试调用都具有要使用的驱动程序的确切名称。
  4. 我很感激,如果有人遇到这种情况并且可能提出想法,如何正确组织测试过程。有人也可以发现其他方法,或者专业人士。上述对比。考虑另一个测试工具也可以选择。

1 个答案:

答案 0 :(得分:1)

您可以创建一个包含所有功能的摘要BaseSpec,但不要在该规范中设置驱动程序。然后为您要测试的每个不同浏览器创建一个子规范,例如。

class FirefoxSeleniumSpec extends BaseSeleniumSpec{

  setupSpec(){
    super.driver = new FirefoxDriver(...)
  }

}

然后您可以运行所有子规范来测试所有浏览器