All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ru.yandex.qatools.allure.utils.AllureShutdownHook Maven / Gradle / Ivy

The newest version!
package ru.yandex.qatools.allure.utils;

import ru.yandex.qatools.allure.Allure;
import ru.yandex.qatools.allure.events.TestSuiteFinishedEvent;
import ru.yandex.qatools.allure.model.Failure;
import ru.yandex.qatools.allure.model.Status;
import ru.yandex.qatools.allure.model.TestCaseResult;
import ru.yandex.qatools.allure.model.TestSuiteResult;

import java.util.Map;
import java.util.Set;

/**
 * If test execution was interrupted this hook can help to save test data.
 *
 * @author Dmitry Baev [email protected]
 *         Date: 08.12.14
 */
public class AllureShutdownHook implements Runnable {

    private final Set> testSuites;

    /**
     * Create a new instance of shutdown hook.
     */
    public AllureShutdownHook(Set> testSuites) {
        this.testSuites = testSuites;
    }

    /**
     * Mark unfinished test cases as interrupted for each unfinished test suite, then write
     * test suite result
     * @see #createFakeTestcaseWithWarning(ru.yandex.qatools.allure.model.TestSuiteResult)
     * @see #markTestcaseAsInterruptedIfNotFinishedYet(ru.yandex.qatools.allure.model.TestCaseResult)
     */
    @Override
    public void run() {
        for (Map.Entry entry : testSuites) {
            for (TestCaseResult testCase : entry.getValue().getTestCases()) {
                markTestcaseAsInterruptedIfNotFinishedYet(testCase);
            }
            entry.getValue().getTestCases().add(createFakeTestcaseWithWarning(entry.getValue()));

            Allure.LIFECYCLE.fire(new TestSuiteFinishedEvent(entry.getKey()));
        }
    }

    /**
     * Create fake test case, which will used for mark suite as interrupted.
     */
    public TestCaseResult createFakeTestcaseWithWarning(TestSuiteResult testSuite) {
        return new TestCaseResult()
                .withName(testSuite.getName())
                .withTitle(testSuite.getName())
                .withStart(testSuite.getStart())
                .withStop(System.currentTimeMillis())
                .withFailure(new Failure().withMessage("Test suite was interrupted, some test cases may be lost"))
                .withStatus(Status.BROKEN);
    }

    /**
     * If test not finished yet (in our case if stop time is zero) mark it as interrupted.
     * Set message, stop time and status.
     */
    public void markTestcaseAsInterruptedIfNotFinishedYet(TestCaseResult testCase) {
        if (testCase.getStop() == 0L) {
            testCase.setStop(System.currentTimeMillis());
            testCase.setStatus(Status.BROKEN);
            testCase.setFailure(new Failure().withMessage("Test was interrupted"));
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy