julia_v_iluhina

Untitled

Aug 25th, 2016
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.15 KB | None | 0 0
  1. public class GoogleSearch {
  2.  
  3. ....
  4.  
  5. public class GoogleSearchTest extends GoogleSearch{
  6. ....
  7.  
  8. /*
  9.     Вот этот GoogleSearch - получился  - то ли свинка, то ли морская )
  10.  
  11.     судя по тому, что в нем реализованы вспомогательные методы - похож на пейдж
  12.     но - при этом - предок для тест-класса
  13.     и еще при этом - имя у класса - GoogleSearch - как у пейджа-модуля,
  14.     а не как у пейджа-объекта(заканчивается на Page) или предка тест-класса (заканчивается на Test)
  15.  
  16.     Очень важный момент
  17.         Предок тест-класса - может реализовывать только какой-то переиспользуемый кусок логики тест-класса
  18.         = что надо сделать до/после запуска всех тестов/каждого теста
  19.         вот это - как раз для предка тест-класса
  20.  
  21.         но - он не может быть контейнером для вспомогательных методов тест-класса (это ответственность пейджа)
  22.  
  23.         погугли single responsibility principle
  24.  
  25.     в этом задании - можно было вообще не заводиться с пейджами
  26.     т к согласно задания
  27.     You will do only a smoke coverage and you most probably will not reuse "steps" in other tests.
  28.     (Or you don't know will you reuse or not)
  29.  
  30.     если удобно вынести - возражать не буду
  31.     но и потребности такой нет
  32.  
  33.     структуру в любом случае - надо поправить
  34. */
  35. ****************************************
  36.     public void openPage(){
  37.         open("http://google.com/ncr");
  38.     }
  39. /*
  40.     лично я избегаю употребления слова Page в каком-тибо другом контексте, кроме
  41.     контекста пейджа (имя класса для пейджа должно заканчиваться на Page
  42.  
  43.     соображения - чтоб избежать двусмысленностей
  44.  
  45.     настаивать на том, что мое мнение - единственно правильное  - не буду)
  46.  
  47.     я бы назвала такой метод openApp, visit
  48. */
  49.  
  50. ************************************************
  51.     public void searchQuery(String queryText){
  52. /*
  53.     с названием параметра queryText - достаточно имени метода search
  54.  
  55.     селектор элемента - можно подобрать нагляднее
  56.     обрати внимание на name поля - в разных продуктах google у строки поиска именно такой name
  57.  
  58.     By.name - можно применить такой метод
  59. */
  60. **************************************
  61.     public void assertCountResult(int count){
  62.  /*
  63.     assertCountOfResults, assertResultsCount, assertResultsNumber  - более точные имена
  64.     https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#heading=h.o7vsh4r93b55
  65.  
  66.     селектор - рабочий
  67.  
  68.     но можно его уточнить - вместо пробела используя знак >
  69.  
  70.     еще такой момент
  71.     это - не единственное место, где мы будем оперировать списком результатов или его внутренними частями
  72.  
  73.     правильнее было бы вынести эту коллекцию в переменную
  74.  */
  75. **************************************
  76.     public void assertTextsFirstElement(int numberOfElement, String queryText){
  77.     /*
  78.         уже применил термин Results - вполне уместно и удачно
  79.         и тут применим - мы проверяем результат
  80.         тогда имя  - достаточно точное и понятное - assertResult
  81.         первый параметр - лучше int index (ниже поясню
  82.         а второй - String text (resultText / containedText) - это уже не текст запроса, это текст результата
  83.  
  84.         про первый параметр
  85.         когда нам нужно указать такой-то элемент коллекции - лучше нумеровать с нуля
  86.             лучше - быть понятнее для большинства
  87.             большинство в большинстве случаев столкнулось с нумерацией с нуля)
  88.             большинство увидело тот же термин -  index
  89.  
  90.             а для индекса элемента в коллекции/массиве - применяется именно термин  index
  91.             мы используя такой термин  - лишний раз подчеркнули - нумеруем с нуля
  92.  
  93.             надеюсь, я тебя убедила
  94.             https://en.wikipedia.org/wiki/Zero-based_numbering
  95.             http://c2.com/cgi/wiki?ZeroAndOneBasedIndexes
  96.             http://stackoverflow.com/questions/24841172/why-is-array-indexing-in-java-start-with-0
  97.  
  98.         т е - не только имя параметра поправь, но и его использование - нумеруем с нуля
  99.     */
  100. ***********************************************
  101.         $$(".st").get(numberOfElement).shouldHave(Condition.text(queryText));
  102. /*
  103.     тут - надо из коллекции результатов (я выше писала - что она нам еще пригодится
  104.     получить результат по индексу
  105.     и у него проверить текст - по вхождению
  106.  
  107.     уточняться до ".st" - не нужно
  108.     нам это ничего не дает
  109.     проверяем - что такой-то текст входит в текст такого-то результата
  110.  
  111.     Condition.text - используй static import
  112. */
  113. *****************************************
  114.     public void followTo(String queryText){
  115.         $(By.linkText(queryText)).click();
  116. /*
  117.     какой хитрый)
  118.     не
  119.     нам надо
  120.     5 follow the link in 1st result
  121.     в списке результатов
  122.     получить такой-то результат
  123.     у него - главную линку
  124.     и на ней - кликнуть
  125.  
  126.     т е - нам нужен метод followLink(int index)
  127. */
  128. ***************************************************************
  129.     public void assertPresentElement(String queryText){
  130.         $(".downloadBox").shouldHave(Condition.exactText(queryText));
  131.     }
  132. /*
  133.     когда нам нужен метод
  134.     когда что-то будет переиспользоваться
  135.     чтобы упростить наш окончательный код - скрыть сложности
  136.     чтобы вместо неочевидного кода - получить вызов метода с наглядым названием
  137.  
  138.     как считаешь - стоило оно того, чтобы реализовывать вместо
  139.     $(".downloadBox").shouldHave(exactText(queryText));
  140.     вариант
  141.     assertPresentElement(String queryText)
  142.     ?
  143.  
  144.     а мы еще и скрыли логику самой проверки
  145.     так что -  использование такого метода
  146.     не даст никаких преимуществ перед
  147.     вариантом, когда прямо в коде тест-метода
  148.     мы напишем $(".downloadBox").shouldHave(exactText(...))
  149.  
  150.     тут еще есть интересный момент)
  151.     если бы ты вспомогательные методы вынес в пейджа
  152.     вот такой метод - туда выносить не стоило)
  153.     т к к собственно логике google search - это не относится
  154.  
  155.     еще - обращай внимание на имена параметров методов
  156.     термин queryText - ты использовал в очень разных смыслах
  157.     это плохо влияет на наглядность кода
  158.  
  159. */
  160. ***********************
  161.  
  162.     @Test
  163.     public void basicLifeCycle(){
  164.     /*
  165.         можно и так назвать)
  166.         а можно и searchAndFollowLink
  167.         пока еще достаточно читаемо
  168.     */
  169. ...
  170.         assertTextsFirstElement(1, "Selenium automates browsers");
  171.         /*
  172.             вот тут - для  этого вызова - будешь использовать параметры
  173.             (0, "Selenium automates browsers")
  174.             это я поясняю мысль про нумерацию с нуля
  175.         */
  176.         followTo("Selenium - Web Browser Automation");
  177.         assertPresentElement("Download Selenium");
  178.         /*
  179.             можно после проверки текста некого элемента со страницы селениума -
  180.             усугубить проверку
  181.             сверив урл текущей станицы с требуемым урлом
  182.  
  183.             так будет точнее всего для выполнения
  184.             6 check that selenium official page is loaded
  185.  
  186.             а проверка текста некого элемента со страницы селениума -
  187.             как раз выполнит функцию умного ожидания загрузки страницы
  188.  
  189.             т к для сверки урла - придется применить простой jUnit-овский
  190.             assertEquals
  191.         */
  192.     }
  193.  
  194. }
Advertisement
Add Comment
Please, Sign In to add comment