рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐
рдХреНрдпрд╛ рдЖрдк рдЕрднреА рднреА 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; } }
рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╢рд░реНрддреЗрдВ
рддреЛ рд╣рдо рдХреНрдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?
- рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЧрдП рд╡рд┐рднрд╛рдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛
- рд╡рд┐рднрд╛рдЧ рдореЗрдВ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ dep1
- Org0 рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП dep0 рд╡рд┐рднрд╛рдЧ рдореЗрдВ рдкрд╣рд▓реЗ рдХрд░реНрдордЪрд╛рд░реА рдХрд╛ рдЙрдкрдирд╛рдо
- 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
ред
рдЪрд┐рддреНрд░
