Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class AtTodoMvcPageWithClearedDataAfterEachTest extends BaseTest {
- // @Before
- // public void openPage() {
- // open("https://todomvc4tasj.herokuapp.com/");
- }
- // @After
- // public void clearData() {
- // executeJavaScript("localStorage.clear()");
- // }
- /*
- по сути - у класса уже нету полезной функциональности
- такой класс нужно удалить из проекта
- */
- *************************
- public class TodoMvcTest extends BaseTest {
- /*
- тут - ок, наследуешься уже от BaseTest
- т е класс AtTodoMvcPageWithClearedDataAfterEachTest - можешь удалить безболезненно
- */
- ************************
- private void ensure() {
- if (url() != "https://todomvc4tasj.herokuapp.com") open("https://todomvc4tasj.herokuapp.com/");
- }
- /*
- имя метода - надо уточнить - что мы обеспечиваем
- ensureUrlOpened - будет лучше
- строки сравнивать нужно, используя метод equals, а не операторы == или !=
- http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java
- http://www.javatpoint.com/string-comparison-in-java
- http://alvinalexander.com/java/edu/qanda/pjqa00001.shtml
- при таком коде, как у тебя сейчас - в любом случае будем выполняться open
- т е - по сути - ничего не оптимизировали, лишь добавили лишней логики
- используй фигурные скобки для if-блока
- https://google.github.io/styleguide/javaguide.html#s4.1.1-braces-always-used
- */
- *******************************
- @Test
- public void editTaskActiveFilter() {
- given();
- givenAtActive(ACTIVE, "a");
- /*
- посмотри - что мы делаем в given() и givenAtActive(ACTIVE, "a")
- разве нам нужно предварительно вызывать given()?
- ведь и в givenAtActive(ACTIVE, "a") - вызывается открытие урла, подготовка локалсториджа и обновление страницы
- касается всех тест-методов
- */
- ****************************
- @Test
- public void editTaskActiveFilter() {
- ...
- @Test
- public void editAllFilter() {
- /*
- напоминаю про тест-план
- https://docs.google.com/spreadsheets/d/1erCY9k7T6tNC11OylZr_cT8D84QJWZIfzBGXt7BhF3g/edit#gid=441152562
- запланировано - покрыть edit на 3-х фильтрах
- а реализовано - лишь 2 тест-метода
- требуется 3 тест-метода для каждого из фильтров
- т к в твоем тест-плане - редактирование на Completed фильтре имеет средний приоритет
- в рамках full coverage(даже оптимизированного) - операции со средним приоритетом мы покрываем
- названия тест-методов - в одних - ты уточняешься до Task, в других - нет
- еще в работе по Smoke+F писала тебе
- вариант 1 deleteTaskAtAllFilter()
- вариант 2 deleteTaskAllFilter()
- вариант с At - корректнее )
- не настаиваю, но советую
- все же подправь
- editAtActiveFilter
- editAtAllFilter
- проработай все имена всех тест-методов
- чтобы логика их имен была единообразной
- порядок тест-методов
- тест-методов - много
- чтобы было легче в них ориентироваться
- разумнее расположить их согласно тест-плану
- либо - продвигаясь по тест-плану сначала по строкам, потом - по столбцам
- (тогда сначала будут идти все 3 метода для edit, потом - для delete и т д)
- либо - продвигаясь по тест-плану сначала по столбцам, потом - по строкам
- (тогда сначала будут идти все методы для All фильтра, потом - для Active и т д)
- оба варианта имеют свои плюсы, но они однозначно лучше хаотичного расположения тест-методов
- хотя технически - поряок тест-методов не имеет никакого значения
- тебе и самому это поможет проконтролировать - все ли что нужно покрыто
- и достаточно ли разнообразны тестовые ситуации для тестирования одного и того же действия
- */
- *************************************************
- @Test
- public void deleteTaskAllFilter() {
- given();
- given(ACTIVE, "a", "b");
- delete("a");
- assertTasksAre("b");
- assertItemsLeft(1);
- }
- ...
- @Test
- public void deleteAllFilter() {
- given();
- given(ACTIVE, "b");
- delete("b");
- assertTasksEmpty();
- }
- ...
- /*
- обрати внимание - реализованы 2 метода, а не 3
- и оба - для all фильтра
- упорядоч тест-методы и иди по тест-плану
- таких ошибок будет избежать легче
- далее покрытие не проверяю - проработай тест-план самостоятельно
- покрой все что запланировано
- */
- **********************
- public void canceleditTaskAllFilter()
- /*
- не забывай про CamelCase написание имен методов
- https://google.github.io/styleguide/javaguide.html#s5.3-camel-case
- не canceledit
- а cancelEdit
- */
- **************************
- @Test
- public void deleteByEmpltyingText() {
- /*
- Empltying или Emptying
- IntelIJ Idea подчеркивает ошибки спеллинга зеленой волнистой линией
- обращай на это внимание
- не забывай уточнять в имени метода - на каком фильтре это покрыто
- */
- given();
- given(ACTIVE, "a", "b");
- edit("b", "");
- filterActive();
- /*
- для проверки того, что таска удалилась
- не нужно переходить на другой фильтр
- достаточно првоерить состояние списка тасок и ItemsLeft
- */
- assertTasksAre("a");
- assertItemsLeft(1);
- }
- ************************************
- private void submitEdit(String oldText, String newText) {
- private void submitEditByClickOutside(String oldText, String newText
- /*
- раз у нас есть 2 варианта подтверждения редактирования - в именах обоих методов
- уточни - как действие выполнено
- вместо submitEdit
- нужно submitEditByPressTab
- */
- ************************************
- @Step
- private void submitEditByClickOutside(String oldText, String newText) {
- startEdit(oldText, newText);
- toggle("b");
- }
- /*
- плохой вариант использовать toggle("b"); для клика на чем-то другом
- во-первых, где гарантии - что будет такая таска - "b"
- во-вторых, при выполнении toggle("b") - выполняется не только смена фокуса, но и еще какие-то действия
- состояние таски "b" - меняется.
- А нам нужно - лишь изменить фокус =
- был активный элемент = редактируемая таска
- стал активный элемент = по которому мы кликнули
- т е - нам нужен такой элемент для клика
- при клике на котором ничего не будет происходить
- можно было бы просто кликнуть на другой таске
- но не факт, что она есть
- да и добавлять третьим параметром - на какой таске кликнуть - это перебор
- так что это - плохой вариант
- можно кликнуть на чем-то типа #header>h1
- это уже значительно лучше
- т к ничего, кроме смены фокуса, не происходит
- что нам и нужно
- и т к этот элемент есть всегда
- единственный недостаток - это то, что мы используем еще один независимый селектор
- можно ли обойтись теми, что мы уже используем?
- есть вариант - "#new-todo"
- мы и уже используем $("#new-todo")
- он всегда есть
- и при клике на нем - ничего кроме смены фокуса не произойдет
- идеальный кандидат)
- только учти вот это
- https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.4i6i27d7lwn4
- */
- *********************************
- @Test
- public void toggleAllFilter() {
- given();
- given(ACTIVE, "a");
- toggle("a");
- assertTasksAre("a");
- }
- /*
- для вспомогательного метода имя toggle - точное
- т к на уровне вспомогательного метода - мы не знаем, комплитим мы таску или переоткрываем
- все зависит от того, к какой таске мы применяем этот метод
- а вот а уровне тест-метода
- мы конечно же знаем - что мы делаем
- мы же сами дикутем тестовые ситуации
- тут мы работакем с кативной таской и вызываем для нее toggle
- значит - мы комплитим таску
- и тест- метод надо назвать соответственно - completeAtAll
- не забывай везде, где это возможно, - второй проверкой проверять ItemsLeft
- это улучшает покрытие и уточняет проверки
- */
- ****************************************
- @Test
- public void clearCompletedAllFilter() {
- given();
- given(ACTIVE, "a", "b");
- toggleAll();
- assertTasksAre("a", "b");
- clearCompleted();
- assertVisibleTasksEmpty();
- }
- /*
- если мы реализуем фиче-тест для clearCompleted
- то нужно в предварительных действиях создать и закомпличеные таски
- чтобы затем не требовалось дополнительно таски комплитить
- у тебя получился небольшой е2е в 2 действия - complete all + clear completed
- начнем с того, что complete all на all фильтре уже покрыто в е2е
- и более не нужно это повторять
- и второе - лучше реализовать именно фиче-тесты в дополнение к уже существующему е2е
- е2е - проверит, как действия работают всместе в одном сценарии - интеграционная проверка
- а фиче-тесты - независимо (что очень важно) проверят каждую операцию отдельно
- */
- **************************
- @Test
- public void reopenAssertItemsLeft() {
- given();
- given(ACTIVE, "a");
- toggleAll();
- assertItemsLeft(0);
- //reopen
- toggle("a");
- assertItemsLeft(1);
- }
- /*
- еще один е2е
- давай все же реализуем фиче-тест для reopen
- сразу создавай и закомпличеные таски - на уровне гивен-метода
- тогда не понадобится комплитить таску
- все эти лишние действия - они ведь тоже могут работать с ошибкой
- в результате - мы так и не проверим reopen - из-за того, что делали лишние действия
- собственно - потому фиче-тесты и независимые
- т к мы проверяем (и выполняем) лишь одно действие
- все фиче-тесты имеют простую структуру
- предварительные действия
- тестируемое действие
- проверка(или проверки)
- это уже мы обсуждали ранее, просмотри ревью к прошлым заданиям
- в имени тест-метода - не нужно указывать про ItemsLeft
- мы это делали практически во всех тест-методах
- и делали это по пути
- это не такая важная информация - чтоб ее выносить на уровень имени тест-метода
- */
- ****************************
- /*
- очень многих тест-методов не хватает
- работай с тест-планом
- приведи линку и на тест-план тоже - когда в следующий раз отдащь хадание на ревью
- сложностей по сути - уже не осталось
- нужно очень внимательно проработать кучу деталей
- если это сделать тщательно - реально за один цикл закончить с этой работой
- */
Advertisement
Add Comment
Please, Sign In to add comment