【问题标题】:Execute Spock Test in Different Environments在不同的环境中执行 Spock 测试
【发布时间】:2015-02-25 13:48:46
【问题描述】:

我有一个 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 ...
}

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

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

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

  1. 使用驱动程序列表并对所有列表成员执行每个操作。因此,对“驱动程序”的每次调用都将替换为“驱动程序。每个 {它}”调用。另一方面,这种方法很难准确地发现哪些驱动程序未通过测试。
  2. 使用方法参数和数据集在每次迭代时启动 Web 驱动程序的新副本。根据 Spock 的理念,这种方法似乎更合乎逻辑,但每次都需要执行大量的驱动程序和 Web 应用程序初始化操作。它还取消了执行“逐步”测试的能力,因为在测试方法之间不会保留驱动程序的状态。
  3. 这些方法的组合,当驱动程序保存在一个映射中,并且每个测试调用都有要使用的驱动程序的确切名称时。

如果有人遇到这种情况并可能提出想法,我将不胜感激,如何正确组织测试过程。有人还可以发现其他方法,或上述方法的优缺点。考虑另一种测试工具也是一种选择。

【问题讨论】:

    标签: groovy spock


    【解决方案1】:

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

    class FirefoxSeleniumSpec extends BaseSeleniumSpec{
    
      setupSpec(){
        super.driver = new FirefoxDriver(...)
      }
    
    }
    

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

    【讨论】:

    • 好点 jk47,我在这里看到的唯一问题是每个场景我需要大约 4-5 个(根据所需功能的数量)测试类。您是否认为可以创建一个自定义注释,这将在测试类编译期间触发每个抽象场景的代码生成?如果有的话,您能否指出一些在 Groovy 中注释驱动的代码生成的好例子?
    • 也许可以创建一个 Spock 扩展来做到这一点,但我怀疑这会很困难。当我编写 Spock 扩展时,这篇博文对我有所帮助:ldaley.com/post/971946675/… 虽然查看现有扩展的源代码也很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 2012-11-14
    相关资源
    最近更新 更多