【问题标题】:Skipping/Ignoring JUnit test cases in Before/Setup method based on Environment Variable在基于环境变量的 Before/Setup 方法中跳过/忽略 JUnit 测试用例
【发布时间】:2017-04-12 17:18:21
【问题描述】:

我有很多类是从具有多个 @Test 用例的抽象 JUnit 类扩展而来的。问题是,在某些扩展类中,只有当一个环境变量具有特定值时,我才需要跳过/忽略所有测试用例。

例如,在 ruby​​ 测试套件中,我可以在 before 方法中执行以下操作:

require 'rubygems'
require 'minitest/spec'
require 'minitest/autorun'
require 'selenium-webdriver'

class WebPcAr < MiniTest::Test
    
    def setup
        
        ...
        
        ### SET URLS
        case ENV['ENVIRONMENT_NAME']
        when "test"
            skip
        when "preprod"
            skip
        when "prod"
            @base_url = 'http://www.google.com.ar/'
        else
            skip
        end
    end

有没有办法在 Java 中做同样的事情?我所能找到的只是@Ignore 方法,但是由于该类运行的@Tests 不在同一个类中,而是在抽象类中,并且这些@Tests 在其他几个类之间共享,我无法添加@忽略那些@Test 用例的标记。也许使用仅存在于那些需要它的特定扩展类中的@Rule?

请记住,@Tests 不在我的班级中,而是与不需要跳过/忽略它们的其他班级共享的抽象班级。而且我需要在同一次运行中运行所有类,我不能将特定于类的参数传递给 maven 命令,因为它需要是特定于类的。

我在这里找到Conditionally ignoring tests in JUnit 4 的其他方法是使用“org.junit.Assume.assumeTrue(someCondition());”行但我不明白如何将它与我的环境变量一起使用:

 @Before
 public void beforeMethod() {
     org.junit.Assume.assumeTrue(someCondition());
     // rest of setup.
 }

也许像Ignore Test Cases Based on Environment 这样的东西?那不是跳过/忽略测试而是给我一个“org.junit.AssumptionViolatedException: test”错误

@Override
public void setUp() throws Exception {
    assumeTrue(System.getenv("AMBIENTE"), equals("prod"));
    super.setUp();
    ...

编辑: 这是我的测试课:

package My.Site.suitesWeb;

import static org.junit.Assert.assertTrue;
//import static org.junit.Assume.assumeTrue;

import org.junit.Ignore;
import org.junit.Test;

import My.Site.classesWeb.*;

public class TestWebPcMySite extends WebPcBase {

    @Override
    public void setUp() throws Exception {
        // Runs only in prod ENVIRONMENT
        String currentEnv = System.getenv("AMBIENTE");
        String expectedEnv = "prod";
        assumeTrue(currentEnv == expectedEnv );
        // Run parent class setup
        super.setUp();
        // Override with specific classes
        goTo = new ObjGoToPageWebPcMySite(driver);
        homePage = new ObjHomePageWebPcMySite(driver);
        loginPage = new ObjLoginPageWebPcMySite(driver);
    }

    // I IGNORE SOME METHODS FROM EXTENDED CLASS
    @Ignore
    @Test
    public void testHigh_LandingPage() throws Throwable {
    }

    @Ignore
    @Test
    public void testLow_LandingPage_LinkLogin() throws Throwable {
    }

    @Ignore
    @Test
    public void testLow_LandingPage_LinkRegister() throws Throwable {
    }

    // I OVERRIDE OTHER METHODS WITH OTHER CODE
    @Test
    public void testHigh_UserLogin_OkUserWithSuscriptionActive() throws Throwable {
        try {
            // Test data

            // Test case
            goTo.homePage(baseUrl);
            homePage.loginButton().click();

            loginPage.userLogin(usernameLogin, passwordLogin);
            assertTrue(homePage.profileNameButton().isDisplayed());
        } catch (Throwable e) {
            utilsCommon.errorHandle(e, suiteName, testName);
            throw e;
        }
    }

}

【问题讨论】:

    标签: java junit environment-variables


    【解决方案1】:

    在您的第一个示例中,您只需将“someCondition()”替换为您的环境检查,例如:

    @Before
    public void beforeMethod() {
        String currentEnv = someMethodToGetYourEnvironment();
        String expectedEnv = "DEV";
        org.junit.Assume.assumeTrue(currentEnv == expectedEnv );
        // rest of setup.
    }
    

    您可能需要注意 @Before 在每个方法之前运行。由于这是一个环境检查,因此在类级别进行检查可能更有意义。相同的概念,但改用@BeforeClass

    【讨论】:

    • 谢谢!但是使用此代码,执行失败并出现“org.junit.AssumptionViolatedException: got: , expected: is ”错误而不是跳过执行
    • 对,所以这个方法仍然会执行,它必须测试假设,但测试应该显示为被忽略而不是失败。如果您发布测试课程,我可能会为您提供更多帮助。
    • 您在设置方法上使用了@Override 注释。我不确定 JUNIT 是否会像使用 @Before@BeforeClass 一样对待失败的假设。尝试将@Override 更改为@BeforeClass
    • 如果我将代码放在@BeforeClass 中,即使条件适用,测试也会跳过,@BeforeClass public static void setUpBeforeClass() throws Exception { // Runs only in prod ENVIRONMENT String currentEnv = System.getenv("AMBIENTE"); String expectedEnv = "prod"; assumeTrue(currentEnv == expectedEnv); }
    • 您是否确认System.getenv("AMBIENTE") 正在返回预期结果,包括大小写?或者,您可以手动将currentEnvexpectedEnv 设置为相同的值。如果测试运行,那么您知道功能是正确的,您需要仔细查看 getenv 的结果。
    猜你喜欢
    • 2013-10-15
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多