我正在一个项目中使用三个不同的部署环境。它们之间的区别只是URL不同。所以我的问题是:“有可能做这样的事情吗?”
browsers {
chrome {
driver = {
new ChromeDriver()
}
}
firefox {
driver = {
new FirefoxDriver();
}
}
}
environments {
development {
baseUrl = "https://baseUrl.dev"
}
staging {
baseUrl = "https://baseUrl.stage"
}
production {
baseUrl = "https://baseUrl.prod"
}
}
为了能够像这样运行我的测试:gradle test -Dgeb.env="development" -Dgeb.browser="chrome"
而不是这样:
environments {
developmentChrome {
driver = {
new ChromeDriver();
}
baseUrl = "https://baseUrl.dev"
}
stagingChrome {
driver = {
new ChromeDriver();
}
baseUrl = "https://baseUrl.stage"
}
productionChrome {
driver = {
new ChromeDriver();
}
baseUrl = "https://baseUrl.prod"
}
developmentFirefox {
driver = {
new FirefoxDriver();
}
baseUrl = "https://baseUrl.dev"
}
stagingFirefox {
driver = {
new FirefoxDriver();
}
baseUrl = "https://baseUrl.stage"
}
productionFirefox {
driver = {
new FirefoxDriver();
}
baseUrl = "https://baseUrl.prod"
}
}
并像这样运行它们:gradle test -Dgeb.env="productionFirefox"
答案 0 :(得分:1)
我的建议是坚持使用Geb约定,并使用geb.env
确定要实例化哪种类型的浏览器驱动程序。根据{{3}}(滚动至第7.2.4节),您可以使用系统属性geb.build.baseUrl
直接配置基本URL。您可以从Maven或Gradle脚本轻松地做到这一点,而不必将该逻辑放入GebConfig
中。如果您坚持认为,您仍然可以将该属性或任何其他自制属性设置为符号值,并通过一点点手动编码在GebConfig
中进行解析。请记住,您可以在那里使用任何类型的Groovy代码,例如Groovy强大的documentation。这样,您还可以实现非直观的逻辑,即将geb.env
用于部署环境,将geb.browser
用于驱动程序。但是正如我说的那样:遵循Geb约定对于以后必须理解或维护您的代码的人可能会更好。
如果有任何不清楚的地方,随时提出后续问题。
答案 1 :(得分:1)
我执行了以下操作,然后您可以运行它:
./gradlew dev-chromeTest
我希望从geb示例项目获得build.gradle: https://github.com/geb/geb-example-gradle/blob/master/build.gradle
然后在驱动程序数组下面添加一个带有基本URL的数组:
drivers = ["chrome", "firefox"]
baseUrls = [
[name: "dev", url: "http://dev-url.com/"],
[name: "beta", url: "http://beta-url.com/"],
]
我对任务部分进行了以下修改:
baseUrls.each { entry ->
drivers.each { driver ->
task "${entry.name}-${driver}Test"(type: Test) {
group JavaBasePlugin.VERIFICATION_GROUP
outputs.upToDateWhen { false } // Always run tests
systemProperty "geb.build.reportsDir", reporting.file("geb/$name")
systemProperty "geb.env", driver
systemProperty "geb.build.baseUrl", entry.url
}
}
}
和测试部分这样:
test {
dependsOn drivers.collect { baseUrls.each{ entry -> tasks["${entry.name}-${it}Test"]} }
enabled = false
}
最后,您可以运行测试,例如:
./gradlew dev-chromeTest
或
./gradlew beta-chromeTest
答案 2 :(得分:0)
假设您还在使用Spock。这就是我处理多种环境的方式...
Geb配置:
如果未将其默认设置为“ chrome”,请使用DriverFactory类基于浏览器属性(-Dbrowser)创建驱动程序。
baseUrl是基于给定的-Dgeb.env值设置的。
driver = DriverFactory.createDriver(System.getProperty("browser", "chrome"))
environments {
dev {
baseUrl = "https://myDevUrl/"
}
qa {
baseUrl = "https://myQaEnvironmentUrl"
}
}
local {
baseUrl = "https://mylocalurl/"
}
}
在单独的类中创建注释,以注释要在特定环境中运行的测试:
import java.lang.annotation.*
@Retention(RetentionPolicy.RUNTIME)
@Target([ElementType.TYPE, ElementType.METHOD])
@Inherited
@interface dev {}
@Retention(RetentionPolicy.RUNTIME)
@Target([ElementType.TYPE, ElementType.METHOD])
@Inherited
@interface qa {}
将以下内容添加到SpockConfig中,以便运行正确的测试:
def environments = [dev: dev, qa: qa, local: dev]
def gebEnv = System.getProperty("geb.env")
if (gebEnv) {
runner {
include environments[gebEnv]
}
}
像这样注释所有测试类:
@dev @qa
class ExampleSpec extends BaseGebSpec {
def "A test to be run on dev and qa"() {
given: "Some stuff"
//Some code
when: "Do some stuff"
//More code
then: "Stuff happens"
//Assertion code
}
}
因此,现在您应该能够在特定的环境/浏览器中运行特定的测试。
答案 3 :(得分:0)
@拉什比
我尝试过使您的响应生效的方法,当然是geb的初学者,但是假设在一个环境中具有不同的url,并且每种环境具有不同的数据源,例如 DEV环境“ https://finandepartment-dev.test.com”,“ https://hrdepartment-dev.test.com” 质量检查环境“ https://finandepartment-qa.test.com”,“ https://hrdepartment-qa.test.com”
和DEV环境具有dev数据库连接,QA环境具有QA数据库连接,在基于环境运行测试时如何配置环境,我可能必须同时使用url(财务和HR)测试可能是从一个网址获取数据并在另一个网址上使用数据,例如API测试。非常感谢您的答复(可能的解决方案)