У меня есть структура testNG, интегрированная с testrails.Из-за ограничений, касающихся API-интерфейса testrail, платформа была разработана для массового сопоставления результатов теста и их загрузки сразу после завершения теста.
Для этого я создал класс BaseTest, которыйпредоставляет переменную id, которую каждый тестовый метод может установить самостоятельно, чтобы соответствовать соответствующему тестовому примеру в тестовых шинахКак только метод теста назначит эту переменную, мы упаковываем ее в объект результата:
public abstract class BaseTest {
protected static final ThreadLocal<Integer> testrailIds = new ThreadLocal();
protected int testRailCaseId = -1;
//TODO: set down a clear and strong process for handling environment/domain. Once that is in place, report it
// loudly so it is clear where the tests ran
protected String baseUrl = "";
protected static final Logger LOG = Logger.getLogger(BaseTest.class);
/**
* records the case ID stored at the individual test level inside the result set for the
* test so that we can access it later when reporting our results
* @param result the result context object
*/
@AfterMethod(alwaysRun = true)
public void afterMethod(ITestResult result) {
if(testRailCaseId == -1) {
LOG.warn("NO CASE ID HAS BEEN SET FOR THIS TEST");
}
result.setAttribute("case_id", testrailIds.get());
}
После того, как все тесты выполнены, мы создаем объект запроса в методе afterSuite и передаем как тестовые случаи, так и результаты теста вtestrail.
for(ISuiteResult suiteResult: suite.getResults().values()) {
ctx = suiteResult.getTestContext();
for (ITestResult result : ctx.getPassedTests().getAllResults()) {
cases.add((int) result.getAttribute("case_id"));
JSONObject resultJson = new JSONObject();
resultJson.put("case_id", result.getAttribute("case_id"));
resultJson.put("status_id", 1);
payload.add(resultJson);
}
for (ITestResult result : ctx.getFailedTests().getAllResults()) {
cases.add((int) result.getAttribute("case_id"));
JSONObject resultJson = new JSONObject();
resultJson.put("case_id", result.getAttribute("case_id"));
resultJson.put("status_id", 5);
payload.add(resultJson);
}
}
// get a clean instance of the api
TestRailApi tr = new TestRailApi();
//now dump that arraylist into a json param and add it to the test run
tr.updateRun(runId, cases);
//once the test run has been created, clean up again and build the results request
tr = new TestRailApi();
tr.addResultsForCases(runId, payload);
testRailCaseId устанавливается в начале каждого метода тестирования с помощью простого присваивания
this.testRailCaseId = 491;
or
testrailIds.set(489);
Это работало нормально, пока мы не начали использовать многопоточность.Теперь значение testRaidCaseId перезаписывается параллельными тестами, что приводит к меньшим наборам результатов, чем ожидалось.
Я пытался управлять потоками через ThreadLocal (как видно из кода выше), нодо сих пор не удалось - значения, которые я пытаюсь установить в методе before или в тестах, заканчиваются пустыми в методах after.
Сами методы тестирования в порядке, моя единственная борьба - с передачей общего содержимогов них от родителя.
У кого-нибудь есть какие-либо рекомендации о том, как управлять моими переменными через baseTest с помощью методов тестирования, чтобы убедиться, что мои различные идентификаторы не перекрывают друг друга?
Пример тестового примера:
@Test
@Parameters({ "domain", "username", "password" })
public void logInAuthEmptyToken(@Optional("http://REDACTED.com") String domain, String username, String password) {
this.testRailCaseId = 385;
Map<String, String> loginInfo = BaseAuthTests.login(domain, username, password);
AuthServiceApi auth = new AuthServiceApi(domain);
auth.addAuthTokens("", loginInfo.get("arrival_key"), loginInfo.get("profile_key"));
auth.executeLogin(400);
}