julia_v_iluhina

Untitled

Oct 10th, 2016
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 16.50 KB | None | 0 0
  1. /*
  2.  
  3.     вначале - напишу общие моменты
  4.     далее - прокомментирую код
  5.  
  6.      Мы реализуем е2е сценарий для smoke покрытия
  7.         это значит - что достаточно покрыть высокоприоритетный юз кейс лишь единожды, на одном из контекстов
  8.  
  9.         т е - единожды покрыли complete на all фильтре - все, этого достаточно
  10.  
  11.         конечно, с добавлением таски так не получится )
  12.         тоже - правильно считай операции)
  13.         add("1","2","3"); - это 3 операции
  14.         потому - нету смысла стараться добавлять все необходимые таски за один вызов метода add
  15.  
  16.         но с остальными операциями - это получится вполне - покрыть операцию лишь единожды
  17.  
  18.         задача smoke покрытия - быстро дать нам фидбек = все высокоприоритетные операции работают
  19.         не -  все высокоприоритетные операции работают на всех контекстах
  20.         а именно вот так - что они работоспособны
  21.  
  22.         дальше - если smoke тестирование пройдено - можно глубже тестировать приложение
  23.         а если нет - так нет смысла продолжать тестировать - есть серьезные проблемы и надо их устранять
  24.  
  25.         в этом задании мы еще стремимся написать такой е2е, который обеспечит все smoke покрытие
  26.         это несколько усложняет нам задачу)
  27.         и эффективность обеспечить, за еще и все высокоприоритетные операции покрыть в сценарии,
  28.         причем - постараться сделать это единожды, да еще и распределить по фильтрам эти операции
  29.  
  30.         это тоже важно  - распределить операции по фильтрам поравномернее
  31.         таким образом уже на уровне smoke тестирования мы лучше проверим на существование такой проблемы -
  32.         когда на одном из фильтров нормально не работают действия над тасками
  33.  
  34.      Приоритет действия высокий если
  35.                 - нерабочее действие не позволяет использовать приложение
  36.                  - у действия нет альтернативы
  37.                  - действие - часто используемое
  38.                  - действие - стандартное для многих приложений
  39.  
  40.                      Примеры высокоприоритетного
  41.                             - добавление задачи - высокоприоритетная штука, потому что если отвалится - приложение не работает
  42.                             - отмена редактирования с помощью esc - во-первых, стандартное поведение, во-вторых - нет альтернативы
  43.                             - закомпличивание/раскомпличивание одной задачи - часто используемое и критично чтоб работало - важный функционал
  44.  
  45.                      Так вот - низкоприоритетные вещи - в smoke-тесте не нужно покрывать.
  46.                      Чтобы оставить smoke тест эффективным
  47.  
  48.                      А вот Reopen All - уже имеет приоритет пониже - т к реже будет использоваться, чем тот же reopen
  49.                      потому - reopen - стоит покрыть, а Reopen All - уже не стоит
  50.  
  51.                      Проверку счетчика Items left - стоит покрыть лишь единожды.
  52.                      В общем-то - это не высокоприоритетная штука.
  53.                      Т к даже если это не будет работать - приложение будет все равно функционально.
  54.                      С другой стороны, на состояние этого счетчика влияет любая выполненная операция.
  55.                      Ввиду этого - в рамках е2е покроем его лишь единожды.
  56.  
  57.     про использование неявных проверок через действие - см текст задания
  58.     вообще - это здорово может повысить эффективность)
  59.  
  60.               вариант 1
  61.               add("task1"");
  62.               edit("task1", "task1 edited");
  63.               delete("task1 edited");
  64.  
  65.               вариант 2
  66.               add("task1", "task2");
  67.               edit("task2", "task2 edited");
  68.               delete("task2 edited");
  69.  
  70.            Вариант 1 = правильное использование таких проверок через действие
  71.  
  72.            Вариант2 = не правильное использование
  73.            Т к последующие действия не проверяют состояние ВСЕХ тасок в списке
  74.  
  75.            Таким образом - ты сможешь эффективно использовать неявные проверки через действия только в случае,
  76.            если в списке тасок будет видима лишь одна таска
  77.  
  78.            Также не забывай - после каждого действия должна быть выполнена проверка
  79.            Сразу
  80.            Не получается использовать неявную проверку через следующее действие - используй явную
  81.            Но - действие должно быть обязательно проверено сразу
  82.  
  83. */
  84.  
  85. public class ToDoMVCTest {
  86.  
  87.     @Test
  88.     public void tasksLifeCycle() {
  89.         open("https://todomvc4tasj.herokuapp.com/");
  90.  
  91.         add("1","2","3");
  92.         assertTasksAre("1","2","3");
  93.         /*
  94.             добавляя сразу несколько тасок -
  95.             ты лишаешь себя возможности использовать неявные проверки через действия
  96.  
  97.             на самом деле  - для следующей операции - нужна лишь одна таска
  98.             вот советую только ее и добавить
  99.         */
  100.  
  101.         edit("1","1e");
  102.         /*
  103.             направление верное )
  104.             еще более наглядно - edit("1","1 edited");
  105.             далее по тексту - будет яснее - что происходило с таской
  106.         */
  107.         assertTasksAre("1e","2","3");
  108.  
  109.         toggle("2");
  110.         toggle("3");
  111.         /*
  112.             после каждой операции - нужна проверка)
  113.             и - достаточно единожды покрыть complete
  114.             в рамках smoke покрытия этого достаточно
  115.  
  116.             если учтешь рекомендации по поводу неявных проверок
  117.             то тут уже получится вот что
  118.                 добавили таску
  119.                 отредактировали ее же
  120.                 закомплитили ее же
  121.                 проверили - в списке тасок - она же
  122.                 потом - переход на active
  123.                 и проверка - что список тасок пуст
  124.  
  125.                 первое хорошее - мы сэкономили на проверках
  126.                     редактирование - проверило добавление
  127.                     закомпличивание - проверило редактирование
  128.                 второе хорошее - мы проверили такие моменты в тестовой логике
  129.                     таски на all фильтре отображаются вне зависимомти от статуса
  130.                     мы максимально точно проверили переход на active
  131.                         (т к состояние списка тасок  поменялось - значит фильтеринг работает
  132.                         т к состояние списка тасок верное - значит фильтеринг работает верно)
  133.                     мы допроверили закомпличивание таски - в проверке после перехода на active
  134.         */
  135.         assertTasksAre("1e","2","3");
  136.  
  137.         filter("completed");
  138.         /*
  139.             почитай вот это
  140.             https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.8bflixemdgfw
  141.  
  142.             и вообще - про KISS principle (в faq - есть про это больше))
  143.         */
  144.         assertTasksAre("","2","3");
  145.         /*
  146.             ага, ты так выкрутилась)
  147.  
  148.             ты увидела вот это - http://joxi.ru/l2ZNaR0F83gJv2 ?
  149.  
  150.             посмотри вот это
  151.             https://drive.google.com/file/d/0B8hgIBw8-V-AdGxxU1R3enl1RzQ/view?usp=sharing
  152.  
  153.             мы можем быть максимально точными и держать 4 проверки
  154.                 2 -
  155.                     в списке = такси с такими-то текстами
  156.                     в списке = пусто
  157.                 и еще 2 -
  158.                     в отфильтрованном по visible списке = таски с такими-то текстами
  159.                     в отфильтрованном по visible списке = пусто
  160.                 И за точность будем платить  тем - что надо думать - когда какую проверку вызвать правильнее
  161.                 и если это делать бездумно - то при небольших изменениях сценариев - могут тесты падать на проверках,
  162.                 или второй вариант - не будем нормально пользоваться полученной точностью...
  163.  
  164.                 мы можем исходить из того, что ошибку, когда невидимые таски копятся в списке - мы тестим на более низком уровне,
  165.                 и на UI уровне - нам не нужно до этого уточняться. Поэтому - мы будем держать всего 2 проверки
  166.                       в отфильтрованном по visible списке = таски с такими-то текстами
  167.                       в отфильтрованном по visible списке = пусто
  168.                 В таком случае - каждый раз понятно - какую проверку вызывать - получаем более KISS картину
  169.                 правда, платим за это точностью) Но - возможно - если мы уже отдельно это в тестах покрыли -
  170.                 что у нас не копятся невидимые таски - так мы и не платим ) И - тогда - все проще в написании тестов,
  171.                 и в их сопровождении.
  172.                 Тогда - поскольку обе проверки реализованы одинаково и других нету - можно из имен проверок скрыть этот нюанс
  173.                 и назвать их assertTasks и assertNoTasks (хотя в них работаем с отфильтрованным по visible списком тасок)
  174.  
  175.  
  176.         */
  177.         toggle("2");
  178.         clearCompleted();
  179.         /*
  180.             вот это решение - покрыть reopen & clear completed
  181.             на completed фильтре - очень разумное)
  182.  
  183.             важные моменты
  184.                 после reopen - нужна проверка
  185.                 тут она будет точной
  186.                 и откладывать ее  - нету причин
  187.  
  188.                 после clear completed - тоже нужна проверка
  189.         */
  190.  
  191.         filter("active");
  192.         /*
  193.             тут - 2 таски в списке
  194.             потому delete("2") - не проверит состояние списка в целом
  195.  
  196.             и нужна проверка
  197.         */
  198.         delete("2");
  199.         assertTasksAre("1e");
  200.         /*
  201.             правильную стратегию выбрала - что отложила удаление таски на самый финиш
  202.             это позволяет поменьше тасок создавать - т к по максимуму их удается использовать
  203.  
  204.             заметь - на конец сценария у тебя есть еще одна таска)
  205.             это наталкивает на мысль - что возможно - столько тасок и не нужно было )
  206.         */
  207.     }
  208. /*
  209.     анализируем покрытие
  210.  
  211.     All
  212.         add *3
  213.         edit
  214.         complete *2
  215.  
  216.     Completed
  217.         reopen
  218.         clear complete
  219.  
  220.     Active
  221.         delete
  222.  
  223.     что мы не сделали
  224.         cancel edit
  225.         complete all
  226.         filter All
  227.  
  228.     что сделали лишний раз
  229.         add - можно єто сделать лишь дважды
  230.         complete - достаточно покрыть лишь единожды
  231.  
  232.     вот теперь задача - скорректироваться немного
  233.     для первой версии - очень неплохой сценарий)
  234.  
  235. */
  236. ****************************************
  237.     public void edit(String taskText, String newTaskText) {
  238.  
  239.         tasks.findBy(exactText(taskText)).doubleClick();
  240.         $(".edit").setValue(newTaskText).pressEnter();
  241.  
  242.     }
  243. /*
  244.     Про имена параметров - верно, что используешь для текста таски - taskText
  245.      для обозначения было-стало - хорошо использовать old & new, from & to
  246.      oldTaskText & newTaskText
  247.      fromTaskText & newTaskText
  248.  
  249.      реализацию второй строчки - придется подправить
  250.      для начала - попробуй применить этот метод для второй таски в списке
  251.  
  252.      этот элемент .edit - он внутренний элемент для редактирвуемой таски
  253.      оттолкнись от tasks, получи редактируемую таску, и затем - получи внутренний элемент .edit
  254.      http://joxi.ru/v29WjP9hGkx9pr
  255. */
  256. **********************************************
  257.     public void filter(String filterName) {
  258.         $("a[href*='"+filterName+"']").click();
  259.     }
  260. /*
  261.     про реализацию переходов по фильтрам - выше писала
  262.    
  263.     по самой операции
  264.     есть такой вариант - более наглядный
  265.     $(By.linkText(...))
  266. */
Advertisement
Add Comment
Please, Sign In to add comment