在JGiven的测试场景中实施测试用例

时间:2019-10-08 08:55:46

标签: java junit automated-tests jgiven

提供了一个包含许多行的文件,该文件由(接受中的)系统加载到数据库中。一个基于JGiven的简单测试方案将检查文件的行数是否与相应的表行匹配。 Java 1.8中 mockup 实现的maven测试执行,提供了以下内容(第一个输出):

Test Class: com.testcomp.LoadingTest
 Check Loading Process
   Given that the parameters provided are for an input file ( BRANCH )for a specific date ( 20190105 )was provided
    When the number of file records is calculated
     And the loading is complete
     And the number of table rows loaded is calculated
    Then the no of file records (200) must match the no of table rows (200)

这是一个有效的选项,但是不提供要加载的文件。因此,我们有两个测试用例,maven测试应提供类似(第二个输出)的内容:

Test Class: com.testcomp.LoadingTest1
 Check Loading Process
   Given that the parameters provided are for an input file ( BRANCH )for a specific date ( 20190105 )
     And the file exists
    When the number of file records is calculated
     And the loading is complete
     And the number of table rows loaded is calculated
    Then the no of file records (200) must match the no of table rows (200)

Test Class: com.testcomp.LoadingTest2
 Check Loading Process
   Given that the parameters provided are for an input file ( BRANCH )for a specific date ( 20190105 )
     And the file does NOT exist
    Then we check nothing

我们如何组合两个测试用例,以便根据文件的存在情况在两种情况下都通过“通过”测试,知道是否提供了文件? 有没有办法创建类似于HTML report of JGiven itself(第三项输出)的东西:

Test Class: com.testcomp.LoadingTest3
 Check Loading Process
   Given that the parameters provided are for an input file ( BRANCH )for a specific date ( 20190105 )
     And the scenario has 2 cases from which only one may be true
    When checking the file's existence is done
     And for case 1 file existence is TRUE
     And for case 1 the number of file records is calculated
     And for case 1 the loading is complete
     And for case 1 the number of table rows loaded is calculated
     And for case 2 file existence is FALSE
    Then for case 1 the no of file records (200) must match the no of table rows (200)
     And for case 2 we check nothing

第一个输出的实现如下:

LoadingTest类

public class LoadingTest
    extends ScenarioTest<GivenWeHaveFile2Load, WhenFileAndDatabaseAreChecked, ThenCheckIfNoOfFileLinesMatchesNoOfTableRows> {

    @ScenarioStage
    WhenFileAndDatabaseAreChecked loadingFinishedState;

    @ScenarioStage
    WhenFileAndDatabaseAreChecked databaseState;

    @Test
    public void Check_Loading_Process() {
        given().that_an_input_file_for_a_specific_date_was_provided("BRANCH", "20190105");
        when().the_number_of_file_records_is_calculated();
        loadingFinishedState
                .and().the_loading_is_complete();
        databaseState
                .and().the_number_of_table_rows_loaded_is_calculated();
        then().the_no_of_file_records_must_match_the_no_of_table_rows();
    }
}

GivenWeHaveFile2Load类

public class GivenWeHaveFile2Load extends Stage<GivenWeHaveFile2Load> {

    @ProvidedScenarioState
    String properFileName;

    @As( "that the parameters provided are for an input file ($) for a specific date ($) was provided" )
    public GivenWeHaveFile2Load that_an_input_file_for_a_specific_date_was_provided(String filenamePrefix, String dateStringYYYYMMDD) {
        properFileName = filenamePrefix + "_" + dateStringYYYYMMDD + ".txt";
        return self();
    }
}

WhenFileAndDatabaseAreChecked类

public class WhenFileAndDatabaseAreChecked extends Stage<WhenFileAndDatabaseAreChecked> {

    @ExpectedScenarioState
    String properFileName;

    @ProvidedScenarioState
    int noOfFileRecords;

    @ProvidedScenarioState
    int noOfTableRows;

    // @ExtendedDescription("after we check the number of file lines") // does NOT seem to work..
    public WhenFileAndDatabaseAreChecked the_number_of_file_records_is_calculated() {
        // we'll use properFileName to get noOfFileRecords in the actual implementation
        noOfFileRecords = 200;
        return self();
    }

    public WhenFileAndDatabaseAreChecked the_loading_is_complete() {
        return self();
    }

    public WhenFileAndDatabaseAreChecked the_number_of_table_rows_loaded_is_calculated() {
        noOfTableRows = 200;
        return self();
    }
}

ThenCheckIfNoOfFileLinesMatchesNoOfTableRows类

public class ThenCheckIfNoOfFileLinesMatchesNoOfTableRows extends Stage<ThenCheckIfNoOfFileLinesMatchesNoOfTableRows> {

    @ExpectedScenarioState
    int noOfFileRecords;

    @ExpectedScenarioState
    int noOfTableRows;

    @ScenarioState
    CurrentStep currentStep;

    public ThenCheckIfNoOfFileLinesMatchesNoOfTableRows the_no_of_file_records_must_match_the_no_of_table_rows () {
        currentStep.setName("the no of file records (" + noOfFileRecords + ") must match the no of table rows (" + noOfTableRows + ")");
        assert(noOfFileRecords == noOfTableRows);
        return self();
    }
}

1 个答案:

答案 0 :(得分:0)

设计了一种满足需求的不同方法:

  • 了解文件是否已提供
  • 根据文件的存在来区分输​​出结果

如果文件确实存在,我们可能有以下内容(第一个输出):

Test Class: com.testcomp.LoadingTest
 Check Loading Process
   Given that the parameters provided are for an input file ( BRANCH )for a specific date ( 20190105 )was provided
     And after checking for file existence ( result: true )
    When the number of file records is calculated
     And the loading is complete
     And the number of table rows loaded is calculated
    Then the no of file records (200) must match the no of table rows (200)

如果文件不存在,我们可能有以下内容(第二个输出):

Test Class: com.testcomp.LoadingTest
 Check Loading Process
   Given that the parameters provided are for an input file ( BRANCH )for a specific date ( 20190105 )was provided
     And after checking for file existence ( result: false )
    Then since we have no file it is OK

要达到上述目的,关键的改变是在GivenWeHaveFile2Load类中定义after_checking_if_file_exists方法,该方法返回一个布尔值表示文件存在。然后可以在LoadingTest类中检查结果,并区分为测试结果显示的“脚本”。在最初的四(4)个类中,仅保留WhenFileAndDatabaseAreChecked。其余三(3)个的代码如下。

LoadingTest


public class LoadingTest
    extends ScenarioTest<GivenWeHaveFile2Load, WhenFileAndDatabaseAreChecked, ThenCheckIfNoOfFileLinesMatchesNoOfTableRows> {

    private Boolean fileExists;

    @ScenarioStage
    GivenWeHaveFile2Load CheckingFileExistenceState;

    @ScenarioStage
    WhenFileAndDatabaseAreChecked loadingFinishedState;

    @ScenarioStage
    WhenFileAndDatabaseAreChecked databaseState;

    @ScenarioStage
    ThenCheckIfNoOfFileLinesMatchesNoOfTableRows NoFileProvidedState;

    @Test
    public void Check_Loading_Process() {
        given().that_an_input_file_for_a_specific_date_was_provided("BRANCH", "20190105");
        fileExists = CheckingFileExistenceState
                .and().after_checking_if_file_exists();
        if (fileExists) {
            when().the_number_of_file_records_is_calculated();
            loadingFinishedState
                    .and().the_loading_is_complete();
            databaseState
                    .and().the_number_of_table_rows_loaded_is_calculated();
            then().the_no_of_file_records_must_match_the_no_of_table_rows();
        } else {
            NoFileProvidedState
                    .then().since_we_have_no_file_it_is_OK();
        }
        ;
    }
}

GivenWeHaveFile2Load

public class GivenWeHaveFile2Load extends Stage<GivenWeHaveFile2Load> {

    private Boolean fileExists;

    @ProvidedScenarioState
    String properFileName;

    @ScenarioState
    CurrentStep currentStep;

    public Boolean after_checking_if_file_exists() {
        currentStep.setName("after checking for file existence ( result: " + fileExists + " )");
        return fileExists;
    }

    public void setFileExists(Boolean fileExists) {
        this.fileExists = fileExists;
    }

    @As( "that the parameters provided are for an input file ($) for a specific date ($) was provided" )
    public GivenWeHaveFile2Load that_an_input_file_for_a_specific_date_was_provided(String filenamePrefix, String dateStringYYYYMMDD) {
        properFileName = filenamePrefix + "_" + dateStringYYYYMMDD + ".txt";
        this.setFileExists(Boolean.FALSE); // actual file check goes here
        return self();
    }
}

ThenCheckIfNoOfFileLinesMatchesNoOfTableRows

public class ThenCheckIfNoOfFileLinesMatchesNoOfTableRows extends Stage<ThenCheckIfNoOfFileLinesMatchesNoOfTableRows> {

    @ExpectedScenarioState
    int noOfFileRecords;

    @ExpectedScenarioState
    int noOfTableRows;

    @ScenarioState
    CurrentStep currentStep;

    public ThenCheckIfNoOfFileLinesMatchesNoOfTableRows the_no_of_file_records_must_match_the_no_of_table_rows () {
        currentStep.setName("the no of file records (" + noOfFileRecords + ") must match the no of table rows (" + noOfTableRows + ")");
        assert(noOfFileRecords == noOfTableRows);
        return self();
    }
    public ThenCheckIfNoOfFileLinesMatchesNoOfTableRows since_we_have_no_file_it_is_OK () {
        assert(Boolean.TRUE);
        return self();
    }
}