#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