julia_v_iluhina

Untitled

Jan 19th, 2017
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.99 KB | None | 0 0
  1. sources (new task 10 + new task 11 + last review changes) - https://github.com/AleksanderPopov/automician_course/tree/master/src/
  2.    разбор full coverage
  3.  
  4. *********************************************
  5. public class AllurePublisher extends TestWatcher {
  6. ...
  7.     @Attachment(value = "Page-screenshot", type = "image/png")
  8.     private static byte[] publishScreenshot(String path) {
  9.         ...
  10.     }
  11.  
  12.     @Attachment(value = "Page-source", type = "text/html")
  13.     private static byte[] publishHtml(String path) {
  14.         ...
  15.     }
  16.  
  17.  ....
  18.     public static class ImmediateAction {
  19.  
  20.        .....
  21.  
  22.         private static void publish(boolean saveScreens, boolean saveHtml) {
  23.             String path = getPathOf(screenshot());
  24.             if (saveScreens) {
  25.                 publishScreenshot(path);
  26.                 delete(path, ".png");
  27.             }
  28.             if (saveHtml) {
  29.                 publishHtml(path);
  30.                 delete(path, ".html");
  31.             }
  32.         }
  33.  
  34.     }
  35. /*
  36.     писала тебе и в ответах на вопросы
  37.     что решение со скриншотами - стало хуже
  38.  
  39.     и сейчас это же пишу
  40.  
  41.     вот так, в иннер-классе - юзать функционал оутер класса
  42.     ну, нет
  43.  
  44.     не понятно, что какой класс должен делать и за что отвечать
  45.  
  46.     поступай как знаешь с этим решением
  47.     сказать что оно ок - я не могу
  48.  
  49.     при том, что в прошлом решении - было дублирование
  50.     оно все равно было лучше этого
  51.  
  52.     по моему мнению)
  53. */
  54. ****************************************************
  55.     public static class Builder {
  56.     ...
  57.         public GivenHelper atAllFilter() {
  58.             this.filter = Filter.ALL;
  59.             return new GivenHelper(this);
  60.         }
  61.  
  62.         public GivenHelper atActiveFilter() {
  63.             this.filter = Filter.ACTIVE;
  64.             return new GivenHelper(this);
  65.         }
  66.  
  67.         public GivenHelper atCompletedFilter() {
  68.             this.filter = Filter.COMPLETED;
  69.             return new GivenHelper(this);
  70.         }
  71. /*
  72.     ну да, оно собразнительно выкинуть из цепочки вызовов build )
  73.     но тогда - кто не в теме может теоретически - запутаться
  74.  
  75.     ведь согласно этого паттерна
  76.     все методы кроме build()
  77.     просто формируют пул свойств строящегося объекта
  78.     и только  build() - строит сам объект
  79.  
  80.     при таком варианте - мы налагаем ограничения на порядок вызовов методов
  81.     которые формируют пул свойств - мы должны вызвать at....Filter()
  82.     причем последним
  83.  
  84.     для Builder Pattern
  85.     если фильтр = обязательный параметр
  86.         то это должен быть параметр конструктора билдера
  87.         а раз мы не хотим светить вовне классом
  88.         то тогда
  89.             у конструктора билдера = параметр Filter filter
  90.             у класса GivenHelper - 3 метода givenAt....
  91.             которые будут вызывать конструктор с нужным параметром
  92.  
  93.     не настаиваю на изменениях
  94.     твой вариант - не канонический)
  95. */
  96. *****************************************************************
  97.         private Builder tasks(TaskType taskType, String... taskNames) {
  98.             Stream.of(taskNames).forEach((taskName) -> tasks.add(new Task(taskType, taskName)));
  99.             return this;
  100.         }
  101. /*
  102.     набрался)
  103.     на экзерцизме скорей всего)
  104.  
  105.     ок вариант
  106. */
  107. **************************************************
  108.     private String doJsonfromList(List<Task> tasks) {
  109.         if (tasks.isEmpty()) return "";
  110.  
  111.         StringBuilder result = new StringBuilder("");
  112.  
  113.         for (Iterator<Task> iter = tasks.iterator(); iter.hasNext(); ) {
  114.             Task task = iter.next();
  115.             result.append("{")
  116.                     .append("'completed':").append(task.type.lsValue)
  117.                     .append(",'title':'").append(task.name)
  118.                     .append("'}")
  119.                     .append(iter.hasNext() ? "," : "");
  120.         }
  121.         return result.toString();
  122.     }
  123. /*
  124.     вариант рабочий
  125.     но код можно упростить
  126.  
  127.     также - даже если фигурные скобки в if / for / ... блоке синтаксически не требуются - применяй их
  128.     согласно conventions это нужно
  129.     https://google.github.io/styleguide/javaguide.html#s4.1.1-braces-always-used
  130.  
  131.     см упрощения
  132. */
  133.     private String doJsonfromList(List<Task> tasks) {
  134.         List<String> lsTasks = new ArrayList<String> ();
  135.  
  136.         for (Task task:tasks) {
  137.             lsTasks.add("{'completed':" + task.type.lsValue + ",'title':'" + task.name + "'}");
  138.         }
  139.  
  140.         return String.join(", ", lsTasks);
  141.     }
  142. /*
  143.     ну да, можно при конкатенации строк еще concat применить для скорости
  144.     ну то уже детали
  145.     http://stackoverflow.com/questions/47605/string-concatenation-concat-vs-operator
  146.  
  147.     твой вариант тоже ок)
  148. */
  149. *****************************************
  150.     private void addTasksToLocalStorage() {
  151.         String tasksJson = doJsonfromList(this.tasks);
  152.  
  153.         if (tasksJson.isEmpty()) {
  154.             executeJavaScript("localStorage.removeItem('todos-troopjs')");
  155.         } else {
  156.             executeJavaScript("localStorage.setItem('todos-troopjs', JSON.stringify([" + tasksJson + "]))");
  157.         }
  158.     }
  159.  /*
  160.     вобще - выполнение localStorage.setItem('todos-troopjs', JSON.stringify([]))
  161.     дает нам очистку списка тасок
  162.  
  163.     так что тут без if-а можно обойтись
  164.  
  165.     doJsonfromList - немного не выдержан CamelCase (From)
  166.  */
  167. ***********************************************
  168. public class TasksIntegrationFlowTest extends BaseTest {
  169.  
  170.     @Test
  171.     public void basicTasksFlow() {
  172.         given().completed("1")
  173.                 .atAllFilter()
  174.                 .prepare();
  175.  
  176.         Tasks.add("2");
  177.         Tasks.edit("2", "edited2");
  178.         Tasks.shouldBe("1", "edited2");
  179.  
  180.         Tasks.goActive();
  181.         Tasks.shouldBe("edited2");
  182.         Tasks.cancelEdit("edited2", "notedited2");
  183.         Tasks.toggle("edited2");
  184.         Tasks.shouldBeEmpty();
  185.  
  186.         Tasks.goCompleted();
  187.         Tasks.shouldBe("1", "edited2");
  188.         Tasks.destroy("edited2");
  189.         Tasks.shouldBe("1");
  190.         Tasks.toggle("1");
  191.         Tasks.shouldBeEmpty();
  192.  
  193.         Tasks.goAll();
  194.         Tasks.shouldBe("1");
  195.     }
  196. }
  197. /*
  198.     при таком вызове методов пейджа - ок, норм исмпользование should
  199.     все ок
  200.     разницы уже особо нет - shouldBe vs shouldHave
  201.  
  202.     с проверками - щас подправлю
  203. */
  204.     @Test
  205.     public void basicTasksFlow() {
  206.         given().completed("1")
  207.                 .atAllFilter()
  208.                 .prepare();
  209.  
  210.         Tasks.add("2");
  211.         Tasks.shouldBe("1", "2");
  212.         Tasks.edit("2", "edited2");
  213.         Tasks.shouldBe("1", "edited2");
  214.  
  215.         Tasks.goActive();
  216.         Tasks.shouldBe("edited2");
  217.         Tasks.cancelEdit("edited2", "notedited2");
  218.         Tasks.toggle("edited2");
  219.         Tasks.shouldBeEmpty();
  220.  
  221.         Tasks.goCompleted();
  222.         Tasks.shouldBe("1", "edited2");
  223.         Tasks.destroy("edited2");
  224.         Tasks.shouldBe("1");
  225.         Tasks.toggle("1");
  226.         Tasks.shouldBeEmpty();
  227.  
  228.         Tasks.goAll();
  229.         Tasks.shouldBe("1");
  230.     }
  231. ***********************
  232.     @Test
  233.     public void add() {
  234.         given().atActiveFilter()
  235.                 .prepare();
  236.  
  237.         Tasks.add("1", "2");
  238.         Tasks.shouldBe("1", "2");
  239.         Tasks.itemsLeftShouldBe(2);
  240.     }
  241. /*
  242.     Tasks.add("1", "2"); - это 2 действия
  243.     в гивен-действиях - укажи что есть таска "1"
  244.  
  245.     и в тестируемом действии = добавь таску "2"
  246.     так проверишь создание второй таски в списке - если біла такая цель
  247.  
  248.  
  249. */
  250. *********************************
  251.     @Test
  252.     public void clearCompleted() {
  253.         given().active("1")
  254.                 .completed("2")
  255.                 .atActiveFilter()
  256.                 .prepare();
  257.  
  258.         Tasks.clearCompleted();
  259.         Tasks.itemsLeftShouldBe(1);
  260.         Tasks.goCompleted();
  261.         Tasks.shouldBeEmpty();
  262.     }
  263. /*
  264.     и после Tasks.clearCompleted(); нужно проверять Tasks.shouldBeEmpty();
  265.  
  266.     вроде бы, стоит
  267.     перейти на All (c Active  на Completed мы уже переходили)
  268.     и выполнить обе проверки  - Tasks.shouldBeEmpty(); и Tasks.itemsLeftShouldBe(1);
  269.     и в названии метода отразить что мы проверили и clearCompleted и navigateToAll
  270.     и тогда уже метод public void navigateToAllFilter() не нужен
  271.     хотя, конечно - в таком тесте - как выше - мы хуже проверяем фильтеринг ...
  272.     что критично. А раз так - то зачесть это как покрытие тестового действия  navigateToAll - не выйдет
  273.  
  274.     в общем, раз так - раз мы все равно не сможем проверить фильтеринг тщательно
  275.     то ок
  276.     пусть будет твой вариант, от имени метода, до его реализации
  277.     но все равно - после Tasks.clearCompleted(); тоже нужно проверять Tasks.shouldBeEmpty();
  278.     действие должно быть проверено сразу
  279.     то, что мы потом еще уточнились - то норм
  280.     но и сразу надо все проверить
  281.  
  282.     таких тестов - есть еще сколько-то
  283.     это учти и для них
  284. */
  285. *********************
  286.     @Step
  287.     public static void editEnter(String fromTaskName, String toTaskName) {
  288.         edit(fromTaskName, toTaskName);
  289.     }
  290. /*
  291.     я б не стала реализовывать такой метод
  292.     ограничилась бы edit-ом
  293.  
  294.     не вижу особых плюсов в существовании editEnter-а
  295. */
Advertisement
Add Comment
Please, Sign In to add comment