我有一个测试,可以登录应用程序并检查一些内容,但登录屏幕不会出现在所有测试环境中。如果没有登录屏幕,登录验证测试将失败,如何通过根据环境禁用/跳过登录测试来克服此问题?
另外,我不太清楚的是,这些测试将与自动化 CI/CD 管道集成。如果没有手动干预,测试如何知道测试是在什么环境下运行的。抱歉,这个问题可能有一个明显的答案,但我是自动化和 CI/CD 的新手。我的测试是用 Java 编写的,非常感谢您的帮助
最佳答案
嗯,TestNG 中有“开箱即用”的注释转换器,您可以使用它实现 transform()
方法,并在您的 @Test
注释上定义语句测试应标记为 ignore=false
TestNG doc.
但是,这种方法有一个缺点 - 必须在您的“test.xml”中设置注释转换器才能使用它。 当你不使用 xml 构建测试 DOM 时 - 那么你可以像这样定义你自己的注释
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface EnvDependentIgnore {
String reason();
Environment env();
boolean skip();
}
此外,您还需要实现 IInvokedMethodListener
以在测试调用之前读取注释值。
public class IgnoreTestListener implements IInvokedMethodListener {
@Override
public void beforeInvocation(IInvokedMethod iInvokedMethod, ITestResult testResult) {
Method method = iInvokedMethod.getTestMethod().getConstructorOrMethod().getMethod();
if (method.isAnnotationPresent(EnvDependentIgnore.class)) {
if (//"your environment value"
.equalsIgnoreCase(method.getAnnotation(EnvDependentIgnore.class).env().getValue()) &&
method.getAnnotation(EnvDependentIgnore.class).skip()) {
throw new SkipException(method.getAnnotation(EnvDependentIgnore.class).reason());
}
}
}
@Override
public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
// no need to implement
}
}
这是一种有点困惑的方法,但对我来说效果很好。
关于java - 如何根据测试环境跳过 Selenium TestNG 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50867421/