在不同环境中执行 Spock 测试
Execute Spock Test in Different Environments
我有一个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 views/pages)。所以这些方法应该实现一些业务相关的逻辑(smth。比如“点击按钮并期待另一个字段中的消息”);但我想测试的另一件事是确保所有浏览器(功能)的行为完全相同。
为了在 'ideal' 世界中实现这一目标,我希望有一种机制来指定特定测试 class 应该多次使用,但使用一些不同的参数。但就目前而言,我看到了为单一方法应用数据集的能力。
我只提出了几个实现这个的想法(根据我目前对 Spock 框架的了解):
- 使用驱动程序列表并对所有列表成员执行每个操作。因此,对 'driver' 的每次调用都将替换为 'drivers.each { it }' 调用。另一方面,这种方法很难准确发现哪些驱动程序未通过测试。
- 使用方法参数和数据集在每次迭代时启动网络驱动程序的新副本。根据 Spock 哲学,这种方法似乎更合乎逻辑,但它需要每次都执行驱动程序和 Web 应用程序初始化的繁重操作。它还删除了执行 'step-by-step' 测试的能力,因为驱动程序的状态不会在测试方法之间保留。
- 这些方法的组合,当驱动程序保存在映射中时,每个测试调用都有要使用的驱动程序的确切名称。
如果有人遇到这种情况并且可以提出想法,如何正确组织测试过程,我将不胜感激。有人还可以发现其他方法,或上述方法的优缺点。考虑另一种测试工具也是一种选择。
您可以创建一个包含所有功能的摘要 BaseSpec
,但不要在该规范中设置驱动程序。然后为每个要测试的不同浏览器创建一个子规范,例如
class FirefoxSeleniumSpec extends BaseSeleniumSpec{
setupSpec(){
super.driver = new FirefoxDriver(...)
}
}
然后你可以运行所有的子规范来测试所有的浏览器
我有一个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 views/pages)。所以这些方法应该实现一些业务相关的逻辑(smth。比如“点击按钮并期待另一个字段中的消息”);但我想测试的另一件事是确保所有浏览器(功能)的行为完全相同。
为了在 'ideal' 世界中实现这一目标,我希望有一种机制来指定特定测试 class 应该多次使用,但使用一些不同的参数。但就目前而言,我看到了为单一方法应用数据集的能力。
我只提出了几个实现这个的想法(根据我目前对 Spock 框架的了解):
- 使用驱动程序列表并对所有列表成员执行每个操作。因此,对 'driver' 的每次调用都将替换为 'drivers.each { it }' 调用。另一方面,这种方法很难准确发现哪些驱动程序未通过测试。
- 使用方法参数和数据集在每次迭代时启动网络驱动程序的新副本。根据 Spock 哲学,这种方法似乎更合乎逻辑,但它需要每次都执行驱动程序和 Web 应用程序初始化的繁重操作。它还删除了执行 'step-by-step' 测试的能力,因为驱动程序的状态不会在测试方法之间保留。
- 这些方法的组合,当驱动程序保存在映射中时,每个测试调用都有要使用的驱动程序的确切名称。
如果有人遇到这种情况并且可以提出想法,如何正确组织测试过程,我将不胜感激。有人还可以发现其他方法,或上述方法的优缺点。考虑另一种测试工具也是一种选择。
您可以创建一个包含所有功能的摘要 BaseSpec
,但不要在该规范中设置驱动程序。然后为每个要测试的不同浏览器创建一个子规范,例如
class FirefoxSeleniumSpec extends BaseSeleniumSpec{
setupSpec(){
super.driver = new FirefoxDriver(...)
}
}
然后你可以运行所有的子规范来测试所有的浏览器