julia_v_iluhina

Untitled

Sep 26th, 2016
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 14.80 KB | None | 0 0
  1. public class TodoMVCUseCases {
  2.  
  3.     @Test
  4.     public void taskWorkFlow(){
  5.         open("https://todomvc4tasj.herokuapp.com/");
  6.  
  7.         add("task1");
  8.         confirmEdit("task1", "task1 edited");
  9.         assertEdited("task1 edited");
  10.         /*
  11.             отлично распорядилась возможностью неявных проверок
  12.             про нейминг и по реализации методов - напишу ниже
  13.  
  14.             проверка текстов тасок в списке перед переходом на другой фильтр - правильное решение
  15.         */
  16.  
  17.         clickFilterActive();
  18.         assertTaskAre("task1 edited");
  19.         /*
  20.             смотри тут какая ситуация
  21.             были в списке таски - "task1 edited"
  22.             перешли на другой фильтр
  23.             стали в списке таски - "task1 edited"
  24.  
  25.             с одной стороны - состояние списка правильное
  26.             что хорошо
  27.  
  28.             с другой стороны - т к состояние списка не изменилось при переходе на другой фильтр
  29.             то такое могло произойти и потому - что переход на другой фильтр просто не работает
  30.  
  31.             т е - для точной проверки фильтеринга - нам надо
  32.             чтобы было-стало списка - изменилось
  33.  
  34.             если еще покрыть на all перед переходом на active фильтр
  35.             complete "task1 edited"
  36.             то
  37.             у нас бы было
  38.                         были в списке таски - "task1 edited"
  39.                         перешли на другой фильтр
  40.                         стали в списке таски - пусто
  41.             мы бы проверили и фильтеринг, и допроверили - закомпличивание таски
  42.         */
  43.  
  44.         toggleAll();
  45.         assertTasksAreNot();
  46.         /*
  47.             маловато мы на active фильтре проверили операций
  48.             лучше - распределить операции поравомернее по фильтрам
  49.         */
  50.  
  51.         clickFilterCompleted();
  52.         /*
  53.             нужна проверка - каждую операцию проверяем сразу
  54.         */
  55.         clearCompleted();
  56.         /*
  57.             нужна проверка
  58.         */
  59.  
  60.         add("task2");
  61.         /*
  62.             вспомни - добавление таски на Completed фильтре - мы не включали в список основных юз кейсов
  63.             и не зря)
  64.             тут, на этом фильтре - это редко будут делать
  65.  
  66.             нужна проверка
  67.         */
  68.         clickFilterAll();
  69.         assertItemLeft(1);
  70.  
  71.         cancelEdit("task2", "task2 edited");
  72.         assertEdited("task2");
  73.         /*
  74.             вот это для бОльшей равномерности можно было и на active фильтре покрыть
  75.         */
  76.  
  77.         toggle("task2");
  78.         clearCompleted();
  79.         /*
  80.             clearCompleted(); - покрыли выше
  81.             попробуй найти вариант - когда не потребуется повторять clearCompleted();
  82.  
  83.             если закомпличивание таски передвинуть выше по сценарию - то как раз и не понадобится повторяться
  84.  
  85.             такое повторение плохо еше и тем - что мы таким образом удаляем таску
  86.             и приходится еще и добавлять дополнительную таску
  87.         */
  88.         assertEmpty();
  89.  
  90.         add("task3");
  91.         delete("task3");
  92.         /*
  93.             а если бы мы покрыли activate на Completed фильтре
  94.             то тут бы как раз было - что удалить)
  95.         */
  96.         assertEmpty();
  97.     }
  98. **************************************************
  99.       All
  100.             add
  101.             confirmEdit
  102.  
  103.  
  104.       Active
  105.             complete all
  106.  
  107.       Completed
  108.             clearCompleted
  109.             add
  110.  
  111.       All
  112.             cancelEdit
  113.             complete
  114.             clearCompleted
  115.             add
  116.             delete
  117.  
  118. /*
  119.     анализируем покрытие
  120.  
  121.     еще надо покрыть - activate
  122.     это очень удобно проверить на Completed фильтре
  123.  
  124.     как уже выше писала - стоит complete перенести выше по сценарию - еще до перехода на active фильтр покрыть
  125.     так уйдет лишний clearCompleted и лишний add
  126.  
  127.     в результате этих изменений - придется и второй add сдвинуть на active фильтр
  128.     что тоже на пользу сценарию будет
  129.  
  130.     также советую сдвинуть и cancelEdit на active фильтр
  131.  
  132.     получишь - что операции будут распределены поравномернее по фильтрам
  133.     что это дает
  134.     такой тест - с равномерно распределенными по фильтрами операциями
  135.     с лучшей вероятностью будет вылавливать проблемы -
  136.     когда на одном из фильтров не работают нормально операции над тасками
  137.  
  138.     в целом - движение верное
  139.         что-то покрыли на all
  140.         перешли на active
  141.         затем на completed
  142.         и вернулись на all
  143.  
  144.     и переходы на каждый из фильтров по разу покрыли
  145.     и есть возможность точно проверить все фильтеринги (да и допроверить кое-что из ранее сделанного)
  146. */
  147. *******************************************
  148.  
  149.     private SelenideElement changeTextInTheEditField(String oldTaskText, String newTaskText){
  150. /*
  151.     я бы назвала метод startEdit/beginEdit
  152.     по сути - мы именно это и делаем - начинаем процесс редактирования таски
  153.  
  154.     если хочется быть точнее - то что-то типа твоего варианта
  155.     startEditChangingText, например
  156.     changeTextInEditField - тоже можно, думаю что и без The - смысл не потеряется
  157.  
  158.     варианты startEdit или startEditChangingText - мне нравятся больше
  159.     т к мы главное говорим в самом начале - что это только начало редактирования
  160.  
  161.     изменение имени - рекомендую, но не настаиваю
  162.  
  163.     с реализацией - все ок
  164. */
  165. *****************************
  166.     private void confirmEdit(String oldTaskText, String newTaskText){
  167. /*
  168.     это - стандартный вариант для редактирования
  169.     потому - можно и edit
  170.  
  171.     для более сложных вариантов подтверждения редактирования - согласна
  172.     придется что-то типа confirmEditByPressTab писать
  173.  
  174.     а тут - можно и без подробностей
  175.  
  176.     тоже не настаиваю
  177. */
  178. *********************************
  179.     private void assertTaskAre(String taskText){
  180.         tasks.shouldHave(CollectionCondition.exactTexts(taskText));
  181.     }
  182. /*
  183.     в прошлой работе у нас был похожий метод, но более универсальный
  184.     который в качестве параметров принимал String... taskTexts
  185.    
  186.     а как тип и имя параметра поменяешь - так и имя метода придется подправить
  187.     важные буквы)
  188.  
  189.     и тут разумно держать более универсальную версию
  190.     более универсальная версия позволит проверить и ситуацию, когда одна таска в списке
  191.     и ситуацию, когда их несколько
  192.  
  193.     посмотри предыдущее задание
  194. */
  195. *******************************
  196.     private void assertTasksAreNot() {
  197.         tasks.filter(visible).shouldBe(empty);
  198.     }
  199.    
  200.     private void assertEmpty(){
  201.         tasks.shouldBe(empty);
  202.     }
  203.  
  204. /*
  205.     предлагаю назвать методы assertNoTasks и  assertNoVisibleTasks - понятнее и нагляднее
  206.  
  207.     в прошлой работе это я пропустила)
  208.     и там метод назывался assertEmpty()
  209.    
  210.     не надо в методах-проверках из имени что-либо скрывать
  211.     тут всегда надо быть однозначным
  212.     надо было указать - что должно быть empty
  213.    
  214.     в отличие от имен методов-действий - тут уже не стоит ничего подразумевать
  215.     уже сейчас - такой набор проверок - что важно - чтобы у них были однозначно понимаемые имена
  216.  
  217.     если тебе важно - поправь в предыдущей работе имя метода assertEmpty()
  218.  
  219.     в assertTasksAreNot ты использовала фильтрацию по visible списка тасок
  220.     да, если такой метод применять на active или completed фильтрах - это действительно хорошее решение
  221.  
  222.     также и для проверки текстов - если проверять тексты тасок на active или completed фильтрах -
  223.     фильтрация по visible тоже понадобится
  224.  
  225.     посмотри вот это видео - и прими решение насчет набора проверок
  226.     https://drive.google.com/file/d/0B8hgIBw8-V-AdGxxU1R3enl1RzQ/view?ts=567ab8d7
  227.     пояснения к видео
  228.     мы можем быть максимально точными и держать 4 проверки
  229.         2 -
  230.             в списке = такси с такими-то текстами
  231.             в списке = пусто
  232.         и еще 2 -
  233.             в отфильтрованном по visible списке = таски с такими-то текстами
  234.             в отфильтрованном по visible списке = пусто
  235.         И за точность будем платить  тем - что надо думать - когда какую проверку вызвать правильнее
  236.         и если это делать бездумно - то при небольших изменениях сценариев - могут тесты падать на проверках,
  237.         или второй вариант - не будем нормально пользоваться полученной точностью...
  238.    
  239.         мы можем исходить из того, что ошибку, когда невидимые таски копятся в списке -
  240.         мы тестим на более низком уровне,
  241.         и на UI уровне - нам не нужно до этого уточняться. Поэтому - мы будем держать всего 2 проверки
  242.               в отфильтрованном по visible списке = таски с такими-то текстами
  243.               в отфильтрованном по visible списке = пусто
  244.         В таком случае - каждый раз понятно - какую проверку вызывать - получаем более KISS картину
  245.         правда, платим за это точностью) Но - возможно - если мы уже отдельно это в тестах покрыли -
  246.         что у нас не копятся невидимые таски - так мы и не платим ) И - тогда - все проще в написании тестов,
  247.         и в их сопровождении.
  248.         Тогда - поскольку обе проверки реализованы одинаково и других нету -
  249.         можно из имен проверок скрыть этот нюанс
  250.         и назвать их assertTasks и assertNoTasks (хотя в них работаем с отфильтрованным по visible списком тасок)
  251. */
  252. ************************************************************
  253.     private void assertEdited(String taskText){
  254.         assertTaskAre(taskText);
  255.     }
  256. /*
  257.     достаточно метода assertTaskAre
  258.    
  259.     имя метода - должно точно отражать то, что метод делает
  260.    
  261.     такого нельзя сказать о методе assertEdited
  262.     т к все очень зависит от контекста - смотря где в сценарии такой метод вызвали
  263. */    
  264. *************************************
  265.     private void clickFilterAll(){
  266.     private void clickFilterActive(){
  267.     private void clickFilterCompleted(){
  268. /*
  269.     с реализацией - ок
  270.    
  271.     названия можно чуть укоротить без ущерба для точности
  272.    
  273.     что делаем - фильтруем + как фильтруем
  274.     filterAll
  275.     filterActive
  276.     filterCompleted
  277. */
  278. *********************************
  279.     private void assertItemLeft(int itemCount){
  280. /*
  281.     используй import static для Condition.exactText
  282.     и тогда в коде можно будет использовать exactText
  283.      
  284.     т к это параметр метода shouldHave - и так понятно, что работаем с кондишеном
  285.     потому без ущерба для понятности можно использовать exactText вместо Condition.exactText  
  286. */    
  287. **************************************************
Advertisement
Add Comment
Please, Sign In to add comment