基于环境变量在Before / Setup方法中跳过/忽略JUnit测试用例

时间:2017-04-12 17:18:21

标签: java junit environment-variables ignore

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

例如,在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;
        }
    }

}

提前致谢。

1 个答案:

答案 0 :(得分:2)

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

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

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