2017-06-29 17 views
2

TestFXでArithmeticProblemクラスの単体テストを書きました。ここでTestFXで複数のシーンをテストする方法

public class ArithmeticProblemTextFx extends TestFxBase { 

    @Test(expected = FxRobotException.class) 
    public void fxIdNotExist() { 
     clickOn("#test123"); 
    } 

    @Test 
    public void allComponentsShouldHaveRightText() { 
     verifyThat("#jfxButtonCheck", hasText("PRÜFEN")); 
     verifyThat("#jfxButtonNextArithmeticProblem", hasText("NÄCHSTE AUFGABE")); 
     verifyThat("#jfxButtonSave", hasText("SPEICHERN")); 
     verifyThat("#jfxTextFieldResult", hasText("")); 
    } 

    @Test 
    public void checkTextFieldResult() { 
     JFXTextField jfxTextFieldResult = find("#jfxTextFieldResult"); 
     JFXButton jfxButtonCheck = find("#jfxButtonCheck"); 

     jfxTextFieldResult.setText("5"); 
     assertFalse(
       "Der Button ist darf NICHT disable sein, da eine Zahl in TextFieldResult steht.", 
       jfxButtonCheck.isDisable() 
     ); 

     jfxTextFieldResult.setText("g"); 
     assertTrue(
       "Der Button muss disable sein, da KEINE Zahl in TextFieldResult steht.", 
       jfxButtonCheck.isDisable() 
     ); 
    } 

    @Test 
    public void checkJfxButtonSaveClick() { 

     clickOn("#jfxButtonSave"); 

     verifyThat("#labelTotalResults", hasText("0")); 
     verifyThat("#labelNumberOfRightResults", hasText("0")); 
     verifyThat("#labelAmountOfRightResults", hasText("(0%)")); 
     verifyThat("#labelNumberOfWrongResults", hasText("0")); 
     verifyThat("#labelAmountOfWrongResults", hasText("(0%)")); 
     verifyThat("#labelTimePerArithmeticProblem", hasText("")); 
     verifyThat("#labelMark", hasText("-")); 
     verifyThat("#labelRightResult", hasText("")); 
     verifyThat("#jfxTextFieldResult", hasText("")); 
    } 

    @Test 
    public void checkJfxButtonNextArithmeticProblemClick() { 

     clickOn("#jfxButtonNextArithmeticProblem"); 

     verifyThat("#labelRightResult", hasText("")); 
     verifyThat("#jfxTextFieldResult", hasText("")); 
     verifyThat("#labelTimePerArithmeticProblem", hasText("")); 
    } 
} 

は私がMain.classをロードすると、それが唯一のArithmeticProblem-シーンを表示する "TestFxBase"

public class TestFxBase extends ApplicationTest { 

    @Before 
    public void setUpClass() throws Exception { 
     ApplicationTest.launch(Main.class); 
    } 

    @After 
    public void afterEachTest() throws TimeoutException { 
     FxToolkit.hideStage(); 
     release(new KeyCode[]{}); 
     release(new MouseButton[]{}); 
    } 

    @Override 
    public void start(Stage stage) throws Exception { 
     stage.show(); 
    } 

    public <T extends Node> T find(final String query) { 
     return (T) lookup(query).queryAll().iterator().next(); 
    } 
} 

のコードです。それはどのように見えるのですか?

enter image description here

私は他のシーンをロードできるかわからないので、だから私は、ArithmeticProblem.classをテストすることができます。 私のメニューには、評価や設定のようないくつかの点がありますが、どのようにこのシーンを読み込むことができますか?

答えて

4

実際に、1つのテストクラスですべてのシーンをテストするべきではありません。それはSRP(Single Responsibility Principle)に違反します。代わりにコンポーネントを分離して、コンポーネントを個別にテストすることができます。即ちArithmeticProblemArithmeticProblemTestクラスで試験すべきであるとSettingsクラスがSettingsTestクラスで試験されなければならない等

TestFX GitHubのリポジトリに良い例があります。これ以上必要とされることはありませんあなただけのシーンに(JavaFX Nodeを)あなたのコンポーネントを追加することができ、この例でそれがnew DesktopPane()で、あなたのケースでは、それはnew ArithmeticProblem()new Settings()など そしてApplicationTest.launch(Main.class);なりますstart方法で

public class DesktopPaneTest extends ApplicationTest { 
    @Override 
    public void start(Stage stage) { 
     Scene scene = new Scene(new DesktopPane(), 800, 600); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    @Test 
    public void should_drag_file_into_trashcan() { 
     // given: 
     rightClickOn("#desktop").moveTo("New").clickOn("Text Document"); 
     write("myTextfile.txt").push(ENTER); 

     // when: 
     drag(".file").dropTo("#trash-can"); 

     // then: 
     verifyThat("#desktop", hasChildren(0, ".file")); 
    } 
} 

@Before 
public void setUpClass() throws Exception { 
    ApplicationTest.launch(Main.class); 
} 

この例では唯一の行動は、与えられた-すると、その後シナリオを使用してテストされていることに注意してください。このシナリオをテストで使用することをお勧めします。

そして、これらのテストはまた、私が思う冗長である:

@Test(expected = FxRobotException.class) 
public void fxIdNotExist() { 
    clickOn("#test123"); 
} 

@Test 
public void allComponentsShouldHaveRightText() { 
    verifyThat("#jfxButtonCheck", hasText("PRÜFEN")); 
    verifyThat("#jfxButtonNextArithmeticProblem", hasText("NÄCHSTE AUFGABE")); 
    verifyThat("#jfxButtonSave", hasText("SPEICHERN")); 
    verifyThat("#jfxTextFieldResult", hasText("")); 
} 

最初のテストは、単に非存在をテストして、2つ目は、ただ何もせずにテキストをテストしているので。これらのテキストでテキストフィールドを作成した場合は、テキストフィールドをそこに置く必要があり、何らかの動作の後でチェックする必要があります。

私の答えがあなたに役立つことを願っています。ご質問がありましたら、私にお書き添えください。

+0

この詳細な回答をいただき、ありがとうございます。私はあなたに投票しますが、私は15未満の評判しか持っていません。 – user6590187

+0

気にしないでください。私はあなたを助けてうれしかったです。答えが正しければ、あなたが望むならそれを受け入れるかもしれません。 – Vanguard

関連する問題