Қияр JVM: дұрыс ерекшелік тасталғанын тексеріңіз

Мен бұл сұраққа онлайн жауап таба алмағаныма таңғаламын. Кез-келген жағдайда, Junit-ды пайдаланған кезде, дұрыс ерекшелік сыналғанын тексеру үшін мен келесідей нәрсені жасайтын едім:

@Test(expected = NullPointerException.class)
    public void testExceptionThrown(){

        taskCreater.createTask(null);
    }

Жоғарыда көріп тұрғандай, бұл талғамның талғампаздығын тексеру әдісі болып табылады, бірақ қияр JVM-ны қолданған кезде осындай талғамға қалай қол жеткізуге болады? Менің тестім дәл осылай көрінеді:

@Then("the user gets a Null pointer exception$")
    public void null_exception_thrown() {
        boolean result = false;
        try {
              taskCreater.createTask(null);
        } catch (NullPointerException e) {

            result = true;
         }
      assertTrue(result);
    }

Бұл ұнамсыз!

14
Өзіңіз болсаңыз, мен сіздердің өтетін сынақ жағдайда ерекше (дерлік) мәжбүрлейтінін білмеймін. Қияр пайдаланушының көзқарасы тұрғысынан жазылған және пайдаланушыны қоспағанда, ешқашан білмеуі керек - бағдарлама мәселені қандай да бір жолмен шешуі тиіс, ол пайдаланушыға жаңа сыналған әрекеттерді орындамауы керек немесе не істеу керек.
қосылды автор Dylanthepiguy, көзі
дұрыс шегініс.
қосылды автор Infested, көзі

7 жауаптар

Бақытсыз жолды сынау қиын болуы мүмкін. Міне, мен оны қиярмен жасады деп таптым.

Scenario: Doing something illegal should land you in jail
    Then a failure is expected
    When you attempt something illegal
    And it fails.

Жарайды, мені атпаңыз, өйткені When Then дегенді Then қоямын, мен оны жақсы деп ойлаймын, бірақ мұны істеудің қажеті жоқ./em>

Мен (қиярға толтырылған) әлемдік нысанымда өзімшілдерді сақтаймын, бірақ сіз оны қадамдық файлыңызда да жасай аласыз, бірақ бұл сізді кейінірек шектейді.

public class MyWorld {
    private boolean expectException;
    private List exceptions = new ArrayList<>();

    public void expectException() {
        expectException = true;
    }

    public void add(RuntimeException e) {
        if (!expectException) {
            throw e;
        }
        exceptions.add(e);
    }

    public List getExceptions() {
        return exceptions;
    }
}

Сіздің қадамдарыңыз өте қарапайым:

@Then("a failure is expected")
public void a_failure_is_expected() {
    myWorld.expectException();
}

Сіз бір кезеңде (кейде кейде) ерекше жағдайды күтіп, оны ұстап, оны әлемге қосыңыз.

@When("you attempt something illegal")
public void you_attempt_something_illegal() {
    try {
        myService.doSomethingBad();
    } catch (RuntimeException e) {
        world.add(e);
    }
}

Енді сіз әлемдегі ерекшеліктердің тіркелгенін тексере аласыз.

@And("it fails")
public void it_fails() {
    assertThat(world.getExceptions(), is(not(empty()));
}

Бұл көзқараста ең құнды нәрсе - ол сіз күтпеген кезде ерекше жағдайды жұтып алмайды.

11
қосылды
Мен бұл тәсілді ұнатамын деп ойлаймын, егер сіз бұл кодты } catch (RuntimeException e) { дегенді } catch (YourExpectedException e) { сынақтан сәтсіздікке ұшырайды
қосылды автор Olivier Boissé, көзі

Сіз junit @Rule аннотациясын ExpectedException көмегімен пайдаланып көрдіңіз бе, мына сияқты:

@Rule
public ExpectedException expectedEx = ExpectedException.none();

@Then("the user gets a Null pointer exception$")
public void null_exception_thrown() {
    expectedEx.expect(NullPointerException.class);
    //expectedEx.expectMessage("the message");
    taskCreater.createTask(null);
}
7
қосылды
Бұл шынымен жұмыс істей ме? Осыған байланысты ол тиімді емес: github.com/cucumber/cucumber-jvm/issues/393
қосылды автор bcoughlan, көзі
бұл дұрыс көзқарас.
қосылды автор Boris the Spider, көзі
Хинд ережелері қиярға назар аудармайды
қосылды автор Olivier Boissé, көзі

Ешқашан Қияр пайдаланбаған, бірақ ол еді

    public void null_exception_thrown() {
            try {
                  taskCreater.createTask(null);
                  fail("Null Pointer Expected");
            } catch (NullPointerException e) {

               //Do Nothing
             }
        }

сіз үшін жұмыс?

3
қосылды

Жүргізілген мінез-құлық сіздің жобаңыздың сипаттамаларына сәйкес келетінін тексереді және жүйені пайдаланған кезде пайдаланушы NullPointerException күткеніне күмәнданамын.

Менің ойымша (жобаңызбен таныс емеспін), тек қана бірліктер сынақтарында тексеруден өту керек, себебі олар күтпеген қатеге немесе пайдаланушының қатесіне сәйкес келеді.

Мінез-құлық тестілерінде ерекше жағдайларды тексеру өте ерекше. Сынақ барысында ерекше жағдай орын алса, ол сәтсіздікке ұшырауы керек.

мысалы:

test.feature

Given that I have a file "users.txt"
And I try to import users /* If an Exception is thrown here, the test fails */
Then I should see the following users: /* list of users */

Менің бірлік тестімде:

@Test(expected = MyException.class)
public void importUsersShouldThrowMyExceptionWhenTheFileIsNotFound() {
   //mock a call to a file and throw an exception
    Mockito.when(reader.readFile("file.txt").thenThrow(new FileNotFoundException());

    importer.importUsers();
}
3
қосылды
«Пайдаланушы» міндетті түрде адам емес. Тесттер жұмыс істейтін кіріс интерфейсі API болуы мүмкін.
қосылды автор bcoughlan, көзі

Меніңше, қияр жоғары деңгейдегі қабылдау сынақтарын төменгі деңгейдегі сынақтардан гөрі тестілеуді көздейді, себебі бұл жағдайда қышқыл құрылымды қажет етпейтін, мінез-құлыққа қарсы құрылымды сынайтын боламыз.

0
қосылды

org.assertj.assertj-core пайдалануды ұсынамын .

Assertions класының арқасында, төмендегідей бекітуді оңайлатуға болады:

@Then("the user gets a Null pointer exception$")
public void null_exception_thrown() {
    Assertions.assertThatThrownBy(() -> taskCreater.createTask(null)).
               isInstanceOf(NullPointerException.class);
}
0
қосылды

Мен ерекше қадамдарда күтілетін ерекше жағдайды пайдаланған болар едім. калькулятордың сынақ мысалы үшін

Бөлімдік ерекшелікке арналған менің файлымның жазбасы:

Scenario: Dividing a number with ZERO
Given I want to test calculator
When I insert 5.5 and 0.0 for division
Then I got Exception ArithmeticException

Мәселен, сіз көре аласыз, мен қоспағанда атауын қосылды. Мәселен, қадамды анықтау кезінде, мен ерекше атауды аламын.

Енді ZERO-мен бөліп, айнымалы мәнге қойғанда, біз ерекше жағдайды аламыз. Осы айнымалы мәнді сынып атауын салыстыру үшін алыңыз (ерекше жағдай)

сондықтан, қадамды анықтауда, онда мен нөлге бөлеймін

private Exception actualException;
 @When("^I insert (.+) and (.+)for division$")
public void iInsertAndForDivision(double arg0, double arg1) throws Throwable {
    try {
        result = calculator.div(arg0, arg1);
    } catch (Exception e) {
        actualException =e;
    }
}

Ерекшелікті тексеру үшін қадамды анықтау керек

  @Then("^I got Exception (.+)")
public void iGotArithmeticException(String aException) throws Throwable {        
Assert.assertEquals("Exception MissMatch",aException,actualException.getClass().getSimpleName());
}

The complete project can be seen here : Steps for cucumber

0
қосылды