Как получить доступ к dependsOnMethod или dependsOnGroup в разных классах, имеющих тесты TestNG?

#java #testng #testng.xml #testng-annotation-test

#java #testng #testng.xml #testng-аннотация-тест

Вопрос:

Мы пишем набор регрессионных тестов на основе TestNG. Скоро у нас будут тесты в разных классах, при этом тест в классе A должен выполняться только после выполнения тестов в классе B. Также нам понадобится средство для доступа к некоторым методам, переменным, которые будут общими для всех.

Я получаю исключение nullpointer и несколько других проблем при попытке собрать и получить доступ к зависимым тестам, распределенным по разным классам. введите описание изображения здесь

 public class BaseTest {
final  TestContext testContext = new TestContext();

TheUser newUser;
String newUserPhoneNumber;
String newUserVerificationCode;

public BaseTest() {
    newUser = testContext.getUserObjectManager().getTheUser();
    newUserPhoneNumber = newUser.generateRandomPhoneNumber();
    newUserVerificationCode = newUser.validVerificationCode();
}

@BeforeSuite
public void requestUserTokens(ITestContext iTestContext) {
    iTestContext.setAttribute("username", newUser.getUsername());
    iTestContext.setAttribute("username", newUser.getPassword());
}
  

}

Тест входа в систему

 public class LoginTests extends BaseTest {
private POSTRequest postRequest;
private String password;
private String username;



@BeforeClass()
@BeforeEach
public void init() {
    newUser = testContext.getUserObjectManager().getTheUser();
    postRequest = new POSTRequest();
    postRequest.chooseEndPoint(OAUTH2_PARTIAL_PATH);
}

@Test(dependsOnGroups = {"SignupGroup"})
public void postRequestUserLogsInWithValidCredentials(ITestContext iTestContext) {
    JSONObject requestBody = new JSONObject();

    requestBody.put("client_id", "**********");
    requestBody.put("grant_type", "password");
    username = iTestContext.getAttribute("username").toString();
    password = iTestContext.getAttribute("password").toString();

    System.out.println("TestContext username--> "   newUser.getUsername());
    System.out.println("TestContext password--> "   newUser.getPassword());

    System.out.println("iTestContext username--> "   username);
    System.out.println("iTestContext password--> "   password);
  

..
..}

Тест регистрации

 public class SignUpTests {
private final TheUser newUser = new TheUser();
String newUserPhoneNumber = newUser.generateRandomPhoneNumber();
String newUserVerificationCode = newUser.validVerificationCode();
private PUTRequest putrequest;
private POSTRequest postRequest;

@BeforeClass
@BeforeEach
public void init() {
    putrequest = new PUTRequest();
    postRequest = new POSTRequest();
    putrequest.chooseEndPoint(API_V1_PARTIAL_PATH);
    postRequest.chooseEndPoint(API_V1_PARTIAL_PATH);
}

@Test(priority = 0, groups = {"SignupGroup"})
public void userEntersInvalidVerificationCode() {
    String invalidVerificationCode = Helper.randomNumber(6);
    JSONObject requestBody = new JSONObject();
    requestBody.put("sms_code", invalidVerificationCode);
    String path = USERS_VERIFICATION_PHONE_NUMBER_PATH   newUser.getVerificationId()   "/";
    Response response = putrequest.putRequest(requestBody, path);

    assertThat(response.getStatusCode(), (anyOf(is(SC_UNPROCESSABLE_ENTITY), is(SC_FORBIDDEN))));
}
  

}

TestNG.xml

 <!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
  
 <test name="SignUp Test Suite" >
    <parameter name="Test without Mock" value="Api test-method Three" />
    <classes >
        <class name="signupAndLogin.SignUpTests" />
    </classes>
</test>

<test name="Login Test Suite">
    <parameter name="Test without Mock" value="Api test-method Three" />
    <groups>
        <dependencies>
            <group depends-on="SignupGroup" name="LoginTestsGroup"/>
        </dependencies>
    </groups>
    <classes>
        <class name="signupAndLogin.LoginTests" />
    </classes>
</test>
  

Пожалуйста, посоветуйте. Заранее спасибо.

Ответ №1:

TestNG хочет, чтобы ваши файлы были в одном пакете.

Попробуйте удалить свой

 <groups>
        <dependencies>
            <group depends-on="SignupGroup" name="LoginTestsGroup"/>
        </dependencies>
    </groups>
  

И вместо этого используйте элемент run, включив группу, которую вы хотите запустить.

Согласно документации, https://testng.org/doc/documentation-main.html#test-groups

Ваш будет выглядеть так

 <test name="SignUp Test Suite" >
    <parameter name="Test without Mock" value="Api test-method Three" />
    <classes >
        <class name="signupAndLogin.SignUpTests" />
    </classes>
</test>

<test name="Login Test Suite">
    <parameter name="Test without Mock" value="Api test-method Three" />
    <groups>
      <run>
        <include name="SignupGroup" />
      </run>
    </groups>
    <classes>
        <class name="signupAndLogin.LoginTests" />
    </classes>
</test>

  

Полезный пример: https://howtodoinjava.com/testng/testng-test-groups /

Комментарии:

1. Если я запускаю, используя выше TestNG.xml тогда тесты входа в систему не запускаются. но если я закомментирую блок <groups></groups>, то эти тесты запускаются, но, очевидно, с ошибкой зависимости

2. Пожалуйста, посмотрите, полезно ли вам следующее toolsqa.com/testng/groups-in-testng

3. у вас есть элемент suite @user2451016 mkyong.com/unittest/testng-groups-example