TestNGの抽象クラスを介したテスト

エントリー



あなたはまだJUnitでテストしていて、TestNGを無視していますか? それから私たちはあなたに行きます。



TestNGの利点の1つは、1つ以上のテスト用にデータのテスト配列を作成できることです。 しかし、空のテストデータセットとして@DataProviderを利用するものはほとんどありません。 それは何で表現されていますか?



testData(String value)



テストとDataProviderを提供するdatas



メソッドがあるとします。 datas



が3つの要素の配列を返す場合、 testData



は3回実行されます。 ただし、 datas



が空の配列を返す場合、 testData



は実行されません

写真




この機能を使用してみましょう。



アプリケーションフレームワークのテスト



特定のカタログからXMLファイルを読み取る特定のOrganizationLoader



クラスがあり、各XMLが従業員の部門の説明を表し、読み取られたデータがOrganizationオブジェクトに変換されるとします。 ( コミット
ソースコード
 public class OrganizationLoader { private OrganizationLoader() { } public static Organization loader(File orgDirectory) { if (orgDirectory == null || !orgDirectory.exists() || !orgDirectory.isDirectory()) { return null; } final File[] files = orgDirectory.listFiles(); if (files == null || files.length < 1) { return null; } XStream xStream = new XStream(); xStream.processAnnotations(Department.class); Organization organization = new Organization(); List<Department> departments = new ArrayList<>(); for (File file : files) { try { String xml = FileUtils.readFileToString(file, "UTF-8"); Department department = (Department) xStream.fromXML(xml); departments.add(department); } catch (IOException e) { e.printStackTrace(); } } organization.setDepartments(departments); return organization; } }
      
      



 public class Organization { private List<Department> departments; public List<Department> getDepartments() { return departments; } public void setDepartments(List<Department> departments) { this.departments = departments; } }
      
      



 @XStreamAlias("department") public class Department { @XStreamAlias("name") private String name; @XStreamAlias("employees") private List<Employee> employees; public List<Employee> getEmployees() { return employees; } public void setEmployees(List<Employee> employees) { this.employees = employees; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
      
      



 @XStreamAlias("employee") public class Employee { @XStreamAlias("lastName") private String lastName; @XStreamAlias("firstName") private String firstName; @XStreamAlias("middleName") private String middleName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getMiddleName() { return middleName; } public void setMiddleName(String middleName) { this.middleName = middleName; } }
      
      







テストの初期条件



では、何をテストしたいのでしょうか?

  1. 処理された部門の数
  2. 部署dep1の従業員数
  3. org0を編成するためのdep0部門の最初の従業員の姓
  4. org1を編成するためのdep2部門の2番目の従業員の姓




簡単なテスト



ここでは、抽象化を使用せずに通常のテストを作成し、後でコミットを比較するものがあるようにします
ソースコード
 public class Organization0Test { private Organization organization; @DataProvider public Object[][] dataEmployeeCount() { return new Object[][]{{"dep1", 2}}; } @DataProvider public Object[][] dataEmployeeLastName() { return new Object[][]{{"dep0", 0, "empLastName0_0"}}; } @BeforeMethod public void setUp() throws Exception { File fRoot = new File("."); File orgDir = new File(fRoot, "src/test/resources/org0"); Assert.assertTrue(orgDir.exists()); Assert.assertTrue(orgDir.isDirectory()); organization = OrganizationLoader.loader(orgDir); Assert.assertNotNull(organization); } @Test public void testDepartmentCount() throws Exception { Assert.assertEquals(organization.getDepartments().size(), 2); } @Test(dependsOnMethods = {"testDepartmentCount"}, dataProvider = "dataEmployeeCount") public void testEmployeesCount(String depName, int countEmployee) throws Exception { final List<Department> departments = organization.getDepartments(); int i = 0; Department department; do { department = departments.get(i++); } while (!department.getName().equals(depName)); Assert.assertEquals(department.getName(), depName); Assert.assertEquals(department.getEmployees().size(), countEmployee); } @Test(dependsOnMethods = {"testDepartmentCount"}, dataProvider = "dataEmployeeLastName") public void testEmployeeLastName(String depName, int employeeIndex, String lastName) throws Exception { final List<Department> departments = organization.getDepartments(); int i = 0; Department department; do { department = departments.get(i++); } while (!department.getName().equals(depName)); Assert.assertEquals(department.getName(), depName); Employee employee = department.getEmployees().get(employeeIndex); Assert.assertEquals(employee.getLastName(), lastName); } }
      
      



 public class Organization1Test { private Organization organization; @DataProvider public Object[][] dataEmployeeCount() { return new Object[][]{{"dep1", 2}}; } @DataProvider public Object[][] dataEmployeeLastName() { return new Object[][]{{"dep2", 1, "empLastName2_1"}}; } @BeforeMethod public void setUp() throws Exception { File fRoot = new File("."); File orgDir = new File(fRoot, "src/test/resources/org1"); Assert.assertTrue(orgDir.exists()); Assert.assertTrue(orgDir.isDirectory()); organization = OrganizationLoader.loader(orgDir); Assert.assertNotNull(organization); } @Test public void testDepartmentCount() throws Exception { Assert.assertEquals(organization.getDepartments().size(), 3); } @Test(dependsOnMethods = {"testDepartmentCount"}, dataProvider = "dataEmployeeCount") public void testEmployeesCount(String depName, int countEmployee) throws Exception { final List<Department> departments = organization.getDepartments(); int i = 0; Department department; do { department = departments.get(i++); } while (!department.getName().equals(depName)); Assert.assertEquals(department.getName(), depName); Assert.assertEquals(department.getEmployees().size(), countEmployee); } @Test(dependsOnMethods = {"testDepartmentCount"}, dataProvider = "dataEmployeeLastName") public void testEmployeeLastName(String depName, int employeeIndex, String lastName) throws Exception { final List<Department> departments = organization.getDepartments(); int i = 0; Department department; do { department = departments.get(i++); } while (!department.getName().equals(depName)); Assert.assertEquals(department.getName(), depName); Employee employee = department.getEmployees().get(employeeIndex); Assert.assertEquals(employee.getLastName(), lastName); } }
      
      







しかし、各テストスイートに対して新しいテストを記述したくはありません。プログラムコードをほぼ完全に繰り返しますか? したがって、次のステップに進みます。



抽象テストクラスを作成し、そこからテストを実装する


抽象クラスAbstractTestsを作成し、すべてのテストメソッドをそこに入れましょう。 また、DataProviderのスタブメソッドを作成します。 ( コミット
ソースコード
 abstract public class AbstractTests { protected Organization organization; abstract protected String getOrgName(); @DataProvider public Object[][] dataDepartmentCount() { return new Object[][]{}; } @DataProvider public Object[][] dataEmployeeCount() { return new Object[][]{}; } @DataProvider public Object[][] dataEmployeeLastName() { return new Object[][]{}; } @BeforeMethod public void setUp() throws Exception { File fRoot = new File("."); File orgDir = new File(fRoot, "src/test/resources/" + getOrgName()); Assert.assertTrue(orgDir.exists()); Assert.assertTrue(orgDir.isDirectory()); organization = OrganizationLoader.loader(orgDir); Assert.assertNotNull(organization); } @Test(dataProvider = "dataDepartmentCount") public void testDepartmentCount(int count) throws Exception { Assert.assertEquals(organization.getDepartments().size(), count); } @Test(dependsOnMethods = {"testDepartmentCount"}, dataProvider = "dataEmployeeCount") public void testEmployeesCount(String depName, int countEmployee) throws Exception { final List<Department> departments = organization.getDepartments(); int i = 0; Department department; do { department = departments.get(i++); } while (!department.getName().equals(depName)); Assert.assertEquals(department.getName(), depName); Assert.assertEquals(department.getEmployees().size(), countEmployee); } @Test(dependsOnMethods = {"testDepartmentCount"}, dataProvider = "dataEmployeeLastName") public void testEmployeeLastName(String depName, int employeeIndex, String lastName) throws Exception { final List<Department> departments = organization.getDepartments(); int i = 0; Department department; do { department = departments.get(i++); } while (!department.getName().equals(depName)); Assert.assertEquals(department.getName(), depName); Employee employee = department.getEmployees().get(employeeIndex); Assert.assertEquals(employee.getLastName(), lastName); } }
      
      







そして、 Organization1Test



クラスとOrganization1Test



クラスを書き換え、テストデータセットのみをそこに書き込みます。
ソースコード
 public class Organization0Test extends AbstractTests { @Override protected String getOrgName() { return "org0"; } @DataProvider @Override public Object[][] dataDepartmentCount() { return new Object[][]{{2}}; } @DataProvider @Override public Object[][] dataEmployeeCount() { return new Object[][]{{"dep1", 2}}; } @DataProvider @Override public Object[][] dataEmployeeLastName() { return new Object[][]{{"dep0", 0, "empLastName0_0"}}; } }
      
      



 public class Organization1Test extends AbstractTests { @Override protected String getOrgName() { return "org1"; } @DataProvider @Override public Object[][] dataEmployeeCount() { return new Object[][]{{"dep1", 2}}; } @DataProvider @Override public Object[][] dataEmployeeLastName() { return new Object[][]{{"dep2", 1, "empLastName2_1"}}; } }
      
      









一度機能


DataProviderのデータが欠落しているためにテストメソッドが失敗した場合、依存テストではまだ完了したと見なされます。

これはOrganization1Test



確認できます。テストメソッドtestEmployeesCount



testEmployeesCount



依存しtestDepartmentCount



。これは、レポートによると、実行されません。 テストデータセットはありません。



機能2


テストはJavaの他のメソッドと違いはなく、再定義することもできるため、さまざまなテストから「ツリー」を構築できます。 読者が興味を持っているなら、そのような「ツリー」の例をレイアウトすることができます。



ニュアンス


AbstractTests抽象クラスのDataProviderスタブを削除すると、テストのシーケンスに応じて、何も実行されないか、一部のみが実行されます。 エラーは発生せず、警告のみです。

別のブランチの例-dataDepartmentCountスタブはdataDepartmentCount



dataDepartmentCount



写真







All Articles