Java-da bodring testi muvaffaqiyatsiz tugagandan so'ng otilgan istisnoga qanday erishish mumkin?

Sinov jarayonidagi xatti-harakatlardan foydalanib:

@After
public void afterTest(Scenario scenario) {
    if (scenario.isFailed()) {
        /*Do stuff*/
    }
}

Lekin men amalga oshirishim kerak bo'lgan ba'zi harakatlar tashlangan Istiqomatga va qaysi kontekstda tashlanganiga bog'liq. Sinovni tugatishga olib keladigan Throwableni olishning bir yo'li bormi? Misol uchun, JUnit'da buni TestWatcher-ni kengaytirish va sinovlarga qoida qo'shish orqali bajaraman:

@Override
protected void failed(Throwable e, Description description) {
    /*Do stuff with e*/
}

Ammo bodring-junit dastur qoidalarni ishlatishga ruxsat bermaydi, shuning uchun bu yechim bodring bilan ishlamaydi.

Sinovga qo'yiladigan istisnoga kirishga nima sababdan foydali bo'lishi mumkinligini tushuntirishim kerak, deb o'ylamayman, biroq men ham bir misol keltiraman:

Mening sinov muhiti doimo barqaror emas, shuning uchun testlarim har qanday vaqtda kutilmagan tarzda muvaffaqiyatsiz bo'lishi mumkin (istalgan vaqtda yuzaga kelishi mumkin bo'lgan istisno holatini topishga harakat qiladigan aniq joy yo'q). Bu sodir bo'lganda, men yana bir urinish uchun qayta rejalashtirish uchun testni talab qilaman va hodisani jurnalga yozib qo'yamiz, shunda biz atrof-muhit beqarorligi haqida qanday yaxshi statistik ma'lumotlarni olishimiz mumkin (qachon, qanchalik tez-tez va qanchalik ko'p)

0

6 javoblar

You can to this by writing your own custom implementation of Formatter & Reporter interface. The empty implementation of Formatter is the NullFormatter.java which you can extend. You will need to provide implementations for the Reporter interface.

Xabarchi interfeysi result() va Formatterning done() usuli bo'lishi mumkin bo'lgan usullar qiziqtirishi mumkin. Natijada() istisnolarga ega Result ob'ektiga ega.

Siz aniqlik uchun RerunFormatter.java ga qarashingiz mumkin.

Github Formatter manbasi

public void result(Result result) {
      //Code to create logs or store to a database etc...
      result.getError();
      result.getErrorMessage();
}

Ushbu sinfni (com.myimpl.CustomFormRep) plaginga qo'shishingiz kerak bo'ladi.

plugin={"pretty", "html:report", "json:reports.json","rerun:target/rerun.txt",com.myimpl.CustomFormRep}

Maxsus formatterlar haqida batafsil ma'lumot.

Qayta ishga tushirish uchun muvaffaqiyatli senariylarning ro'yxatini olish uchun qaytadan plaginni ishlatishingiz mumkin. Ketma-ket ishlarni bajarish uchun kodni tekshirishni amalga oshirish yoki CI vositangizda birovni rejalashtirish haqida ishonchingiz komil emas.

0
qo'shib qo'ydi

You can to this by writing your own custom implementation of Formatter & Reporter interface. The empty implementation of Formatter is the NullFormatter.java which you can extend. You will need to provide implementations for the Reporter interface.

Xabarchi interfeysi result() va Formatterning done() usuli bo'lishi mumkin bo'lgan usullar qiziqtirishi mumkin. Natijada() istisnolarga ega Result ob'ektiga ega.

Siz aniqlik uchun RerunFormatter.java ga qarashingiz mumkin.

Github Formatter manbasi

public void result(Result result) {
      //Code to create logs or store to a database etc...
      result.getError();
      result.getErrorMessage();
}

Ushbu sinfni (com.myimpl.CustomFormRep) plaginga qo'shishingiz kerak bo'ladi.

plugin={"pretty", "html:report", "json:reports.json","rerun:target/rerun.txt",com.myimpl.CustomFormRep}

Maxsus formatterlar haqida batafsil ma'lumot.

Qayta ishga tushirish uchun muvaffaqiyatli senariylarning ro'yxatini olish uchun qaytadan plaginni ishlatishingiz mumkin. Ketma-ket ishlarni bajarish uchun kodni tekshirishni amalga oshirish yoki CI vositangizda birovni rejalashtirish haqida ishonchingiz komil emas.

0
qo'shib qo'ydi

Agar siz faqat hisobotga yuborilgan natijani massajlashni xohlasangiz, siz CucumberJSONFormatter kengaytirishi va shunday usul natijasini bekor qilishingiz mumkin:

public class CustomReporter extends CucumberJSONFormatter {

    CustomReporter(Appendable out) {
        super(out);
    }

    /**
     * Truncate the error in the output to the testresult.json file.
     * @param result the error result
     */
    @Override
    void result(Result result) {
        String errorMessage = null;
        if (result.error) {
            errorMessage = "Error: " + truncateError(result.error);
        }
        Result myResult = new Result(result.status, result.duration, errorMessage);
       //Log the truncated error to the JSON report
        super.result(myResult);
    }
}

Keyin plagin parametrini quyidagilarga o'rnating:

plugin = ["com.myimpl.CustomReporter:build/reports/json/testresult.json"]
0
qo'shib qo'ydi

Agar siz faqat hisobotga yuborilgan natijani massajlashni xohlasangiz, siz CucumberJSONFormatter kengaytirishi va shunday usul natijasini bekor qilishingiz mumkin:

public class CustomReporter extends CucumberJSONFormatter {

    CustomReporter(Appendable out) {
        super(out);
    }

    /**
     * Truncate the error in the output to the testresult.json file.
     * @param result the error result
     */
    @Override
    void result(Result result) {
        String errorMessage = null;
        if (result.error) {
            errorMessage = "Error: " + truncateError(result.error);
        }
        Result myResult = new Result(result.status, result.duration, errorMessage);
       //Log the truncated error to the JSON report
        super.result(myResult);
    }
}

Keyin plagin parametrini quyidagilarga o'rnating:

plugin = ["com.myimpl.CustomReporter:build/reports/json/testresult.json"]
0
qo'shib qo'ydi

Ko'zgular yordamida ushbu usulni qo'lladim. To'g'ridan-to'g'ri qadam xatolariga kirish mumkin emas (yacheykalik iz). Men "stepResults" atributiga kirishga ruxsat beruvchi ushbu statik usulni yaratdim, keyin siz uni yineleyebilir, xato qilishingiz va xohlaganingizni qilishingiz mumkin.

@After
public void afterScenario(Scenario scenario) {
  if (scenario.isFailed())
    logError(scenario);
}


private static void logError(Scenario scenario) {
   Field field = FieldUtils.getField(((ScenarioImpl) scenario).getClass(), "stepResults", true);
   field.setAccessible(true);
   try {
       ArrayList results = (ArrayList) field.get(scenario);
       for (Result result : results) {
           if (result.getError() != null)
               LOGGER.error("Error Scenario: {}", scenario.getId(), result.getError());
       }
   } catch (Exception e) {
       LOGGER.error("Error while logging error", e);
   }
}
0
qo'shib qo'ydi

Ko'zgular yordamida ushbu usulni qo'lladim. To'g'ridan-to'g'ri qadam xatolariga kirish mumkin emas (yacheykalik iz). Men "stepResults" atributiga kirishga ruxsat beruvchi ushbu statik usulni yaratdim, keyin siz uni yineleyebilir, xato qilishingiz va xohlaganingizni qilishingiz mumkin.

@After
public void afterScenario(Scenario scenario) {
  if (scenario.isFailed())
    logError(scenario);
}


private static void logError(Scenario scenario) {
   Field field = FieldUtils.getField(((ScenarioImpl) scenario).getClass(), "stepResults", true);
   field.setAccessible(true);
   try {
       ArrayList results = (ArrayList) field.get(scenario);
       for (Result result : results) {
           if (result.getError() != null)
               LOGGER.error("Error Scenario: {}", scenario.getId(), result.getError());
       }
   } catch (Exception e) {
       LOGGER.error("Error while logging error", e);
   }
}
0
qo'shib qo'ydi