我有一个用 TestNG 用 Selenide 和 Cucumber 编写的项目。我正在从 TestRunner 运行测试,并且测试是用 Gherkin 语法编写的。我与 BrowserStack 集成,一切正常 - 构建在 BrowserStack 中正常运行。但我对测试名称有疑问。目前每个测试名称都是相同的 -
runners.TestRunner-runScenario
。我阅读了文档,发现有一个 sessionName
参数,我可以在功能中命名。问题是我同时一个接一个地运行多个测试,并且该参数必须根据当前运行的测试进行更改。例如,通过这个测试:
Feature: Login tests
Scenario: Correct login
Given The user is on the "site"
When the page is loaded
And the user enter the email "test" and password "test" and click "Sign in" button
Then the user should be logged in
Scenario: Incorrect login
Given The user is on the "site"
When the page is loaded
And the user enter the email "xxx" and password "xxx" and click "Sign in" button
Then the user should see the error
我想从场景中获取每个测试的名称(例如,正确登录,错误登录),并在每次运行该测试时在 BrowserStack 中使用它作为测试名称。可以吗?
我的 TestRunner 很简单:
@Test
@CucumberOptions(
features = "src/test/resources/features",
glue = {"stepDefinitions"},
plugin = {"pretty", "html:target/cucumber-report.html", "io.qameta.allure.cucumber7jvm.AllureCucumber7Jvm"}
)
public class TestRunner extends AbstractTestNGCucumberTests {
static {
System.setProperty("IS_CUCUMBER_TEST", "true");
}
}
在 Abhimanyu Koul 的回答后编辑:
这是一个很好的解决方案,使用
JavascriptExecutor
。我改变了tearDown
方法:
@After
public void tearDown(Scenario scenario) {
String scenarioName = scenario.getName();
setBrowserStackTestName(scenarioName);
Selenide.closeWindow();
}
并添加了
setBrowserStackTestName
方法:
private void setBrowserStackTestName(String testName) {
JavascriptExecutor jsExecutor = (JavascriptExecutor) WebDriverRunner.getWebDriver();
jsExecutor.executeScript("browserstack_executor: {\"action\": \"setSessionName\", \"arguments\": {\"name\":\"" + testName + "\"}}");
}
但这还有另一个问题。现在,在 BrowserStack 中,测试的名称正在更改,但只有一瞬间 - 在测试结束时。但是当状态显示并开始运行另一个测试时,测试名称又恢复为默认名称:
runners.TestRunner-runScenario
您可以探索使用 browserstack_executor 命令的选项,该命令允许在运行时更新会话名称。您可以参考参考文档以更好地理解所需的语法。
您可以将 scenario.getName() 方法与 teardown 方法中的 browserstack_executor 命令结合使用,以在运行时在 BrowserStack Platform 上设置会话名称。
参考代码 ->
@After
public void teardown(Scenario scenario) throws Exception {
Thread.sleep(2000);
String scenarioName = scenario.getName();
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("browserstack_executor: {\"action\": \"setSessionName\", \"arguments\": {\"name\":\"" + scenarioName + "\" }}");
driver.quit();
}
注意:您也可以在拆卸方法之外使用 browserstack_executor 命令。
如果您的查询特定于 BrowserStack,您可以联系 BrowserStack 支持 (https://www.browserstack.com/contact)