TestNG рдореЗрдВ рдЕрдореВрд░реНрдд рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░реАрдХреНрд╖рдг

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐



рдХреНрдпрд╛ рдЖрдк рдЕрднреА рднреА JUnit рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ TestNG рдХреА рдЕрдирджреЗрдЦреА рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдлрд┐рд░ рд╣рдо рдЖрдкрдХреЗ рдкрд╛рд╕ рдЬрд╛рддреЗ рд╣реИрдВред



TestNG рдХреЗ рд▓рд╛рднреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рд╕рд░рдгрд┐рдпрд╛рдБ рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреБрдЫ рдЦрд╛рд▓реА рдЯреЗрд╕реНрдЯ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ @DataProvider рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ рд╡реНрдпрдХреНрдд рдХреНрдпрд╛ рд╣реИ?



рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ testData(String value)



рдкрд░реАрдХреНрд╖рдг рдФрд░ рдПрдХ рдбреЗрдЯрд╛ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдПрдХ рдбреЗрдЯрд╛рдкреНрд░реЛрд╡рд╛рдЗрдбрд░ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдпрджрд┐ testData



рд╣рдореЗрдВ 3 рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рджреЗрддрд╛ рд╣реИ, рддреЛ testData



3 рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ testData



рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдЦрд╛рд▓реА рд╕рд░рдгреА рджреЗрддрд╛ рд╣реИ, рддреЛ testData



рдХрднреА рднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛

рддрд╕реНрд╡реАрд░реЗрдВ




рдЖрдЗрдП рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред



рдкрд░реАрдХреНрд╖рдг рдЖрд╡реЗрджрди рдХреА рд░реВрдкрд░реЗрдЦрд╛



рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд OrganizationLoader



рдХреНрд▓рд╛рд╕ рд╣реИ рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреИрдЯрд▓реЙрдЧ рд╕реЗ XML рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ XML рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рднрд╛рдЧ рдХреЗ рд╡рд┐рд╡рд░рдг рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрдврд╝рд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рд╕рдВрдЧрдарди рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред ( рдкреНрд░рддрд┐рдмрджреНрдз )
рд╕реНрд░реЛрдд рдХреЛрдб
 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 рд╡рд┐рднрд╛рдЧ рдореЗрдВ рджреВрд╕рд░реЗ рдХрд░реНрдордЪрд╛рд░реА рдХрд╛ рдЙрдкрдирд╛рдо




рд╕рд░рд▓ рдкрд░реАрдХреНрд╖рдг



рдпрд╣рд╛рдВ рд╣рдо рдЕрдореВрд░реНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рд╛рдзрд╛рд░рдг рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВрдЧреЗ, рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рдкреНрд░рддрд┐рдмрджреНрдз рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реЛ
рд╕реНрд░реЛрдд рдХреЛрдб
 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); } }
      
      







рдФрд░ рд╣рдо Organization0Test



рдФрд░ 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



рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд░рд┐рдкреЛрд░реНрдЯреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИред



рд╕реБрд╡рд┐рдзрд╛ рджреЛ


рдкрд░реАрдХреНрд╖рдг рдЬрд╛рд╡рд╛ рдореЗрдВ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ "рдкреЗрдбрд╝" рдмрди рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд░ рдкрд╛рдардХреЛрдВ рдХреА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ "рдкреЗрдбрд╝" рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред



рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░


рдпрджрд┐ рдЖрдк рдПрдмреНрд╕рдЯреНрд░реИрдХреНрдЯ рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрдЯ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдбреЗрдЯрд╛рдкреНрд░реЙрдЗрдбрд░ рд╕реНрдЯрдм рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ, рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдХрд┐рд╕реА рдХреЛ рднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдХреЗрд╡рд▓ рднрд╛рдЧ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдЧреА - рдмрд╕ рдПрдХ рдЪреЗрддрд╛рд╡рдиреАред

рдПрдХ рдЕрд▓рдЧ рд╢рд╛рдЦрд╛ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг - рдбреЗрдЯрд╛рдбреЗрдкрдмреЙрдХреНрд╕ рд╕реНрдЯрдм dataDepartmentCount



рдЧрдпрд╛ dataDepartmentCount



ред
рдЪрд┐рддреНрд░







All Articles