diff --git a/lesson6/src/ru/sms/lesson6/ForTesting.java b/lesson6/src/ru/sms/lesson6/ForTesting.java new file mode 100644 index 0000000..3ff4f07 --- /dev/null +++ b/lesson6/src/ru/sms/lesson6/ForTesting.java @@ -0,0 +1,45 @@ +package ru.sms.lesson6; + +import ru.sms.lesson6.annotations.AfterSuite; +import ru.sms.lesson6.annotations.BeforeSuite; +import ru.sms.lesson6.annotations.Test; + +public class ForTesting { + @BeforeSuite + public void beforeClass(){ + System.out.println("before class"); + } + @Test(Test.Priority.NORMAL) + public void test1(){ + System.out.println("test1"); + } + @Test(Test.Priority.LOWEST) + public void test2(){ + System.out.println("test2"); + } + @Test(Test.Priority.LOW) + public void test3(){ + System.out.println("test3"); + } + @Test(Test.Priority.HIGHEST) + public void test4(){ + System.out.println("test4"); + } + @Test(Test.Priority.HIGH) + public void test5(){ + System.out.println("test5"); + } + @Test(Test.Priority.NORMAL) + public void test6(){ + System.out.println("test6"); + } + @Test(Test.Priority.NORMAL) + public void test7(){ + System.out.println("test7"); + } + @AfterSuite + public void afterClass(){ + System.out.println("after class"); + } + +} diff --git a/lesson6/src/ru/sms/lesson6/Main.java b/lesson6/src/ru/sms/lesson6/Main.java new file mode 100644 index 0000000..55f3751 --- /dev/null +++ b/lesson6/src/ru/sms/lesson6/Main.java @@ -0,0 +1,18 @@ +/* +Создать класс, который может выполнять «тесты». В качестве тестов выступают классы с наборами методов с аннотациями @Test. +Для этого у него должен быть статический метод start(), которому в качестве параметра передается или объект типа Class, или имя класса. +Из «класса-теста» вначале должен быть запущен метод с аннотацией @BeforeSuite, если такой имеется. Далее запущены методы с аннотациями @Test, +а по завершении всех тестов – метод с аннотацией @AfterSuite. К каждому тесту необходимо добавить приоритеты (int числа от 1 до 10), +в соответствии с которыми будет выбираться порядок их выполнения. Если приоритет одинаковый, то порядок не имеет значения. +Методы с аннотациями @BeforeSuite и @AfterSuite должны присутствовать в единственном экземпляре, иначе необходимо бросить RuntimeException при запуске «тестирования». + */ + +package ru.sms.lesson6; + +import java.lang.reflect.InvocationTargetException; + +public class Main { + public static void main(String[] args) throws InvocationTargetException, IllegalAccessException { + Tester.start(ForTesting.class); + } +} diff --git a/lesson6/src/ru/sms/lesson6/Tester.java b/lesson6/src/ru/sms/lesson6/Tester.java new file mode 100644 index 0000000..b88b876 --- /dev/null +++ b/lesson6/src/ru/sms/lesson6/Tester.java @@ -0,0 +1,48 @@ +package ru.sms.lesson6; + +import ru.sms.lesson6.annotations.AfterSuite; +import ru.sms.lesson6.annotations.BeforeSuite; +import ru.sms.lesson6.annotations.Test; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.*; +import java.util.stream.Collectors; + +class Tester { + static void start(Class clazz) throws InvocationTargetException, IllegalAccessException { + final List methods = Arrays.asList(clazz.getMethods()); + final List setBeforeSuite = methods.stream() + .filter(method -> method.getAnnotation(BeforeSuite.class) != null) + .collect(Collectors.toList()); + if (setBeforeSuite.size() > 1) + throw new RuntimeException("BeforeSuite annotation must be in one exemplar"); + if (setBeforeSuite.size() > 0){ + final Method method = setBeforeSuite.get(0); + method.invoke(new ForTesting()); + } + + final Set setTest = methods.stream() + .filter(method -> method.getAnnotation(Test.class) != null) + .collect(Collectors.toSet()); + Map methodPriorityMap = new HashMap<>(); + while (setTest.iterator().hasNext()) { + final Method method = setTest.iterator().next(); + final Test.Priority priority = method.getAnnotation(Test.class).value(); + methodPriorityMap.put(method, priority); + } + //TODO: Отсортировать мапу и выполнить все методы. + + final Set setAfterSuite = methods.stream() + .filter(method -> method.getAnnotation(AfterSuite.class) != null) + .collect(Collectors.toSet()); + if (setAfterSuite.size() > 1) { + throw new RuntimeException("AfterSuite annotation must be in one exemplar"); + } + else if (setAfterSuite.iterator().hasNext()) { + setAfterSuite.iterator().next().invoke(new ForTesting()); + } + + + } +} diff --git a/lesson6/src/ru/sms/lesson6/annotations/AfterSuite.java b/lesson6/src/ru/sms/lesson6/annotations/AfterSuite.java new file mode 100644 index 0000000..6387354 --- /dev/null +++ b/lesson6/src/ru/sms/lesson6/annotations/AfterSuite.java @@ -0,0 +1,11 @@ +package ru.sms.lesson6.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface AfterSuite { +} diff --git a/lesson6/src/ru/sms/lesson6/annotations/BeforeSuite.java b/lesson6/src/ru/sms/lesson6/annotations/BeforeSuite.java new file mode 100644 index 0000000..dc2fa67 --- /dev/null +++ b/lesson6/src/ru/sms/lesson6/annotations/BeforeSuite.java @@ -0,0 +1,11 @@ +package ru.sms.lesson6.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface BeforeSuite { +} diff --git a/lesson6/src/ru/sms/lesson6/annotations/Test.java b/lesson6/src/ru/sms/lesson6/annotations/Test.java new file mode 100644 index 0000000..0030fda --- /dev/null +++ b/lesson6/src/ru/sms/lesson6/annotations/Test.java @@ -0,0 +1,31 @@ +package ru.sms.lesson6.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface Test { +Priority value(); + +enum Priority { + LOWEST(1), + LOW(2), + THREE(3), + FOUR(4), + NORMAL(5), + SIX(6), + SEVEN(7), + EIGHT(8), + HIGH(9), + HIGHEST(10); + private int priorityValue; + + + Priority(int priorityValue) { + this.priorityValue = priorityValue; + } + } +}