Проблемы с отчетами TestNG из-за многопоточности - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть структура 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...