Advertisement
julia_v_iluhina

Untitled

Oct 21st, 2016
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.19 KB | None | 0 0
  1. @app.route('/todo/api/v1.0/tasks/reset', methods = ['GET'])
  2. @auth.login_required
  3. def reset_tasks():
  4.     global tasks
  5.     tasks = [
  6.         {
  7.             'id': 1,
  8.             'title': u'Buy groceries',
  9.             'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
  10.             'done': False
  11.         },
  12.         {
  13.             'id': 2,
  14.             'title': u'Learn Python',
  15.             'description': u'Need to find a good Python tutorial on the web',
  16.             'done': False
  17.         }
  18.     ]
  19.     return jsonify( { 'tasks': map(make_public_task, tasks) } )
  20.  
  21. /*
  22.     смотри, весь этот кусок - точная копия объявления tasks при старте
  23.  
  24.     ты при старте
  25.         объяви не tasks, a default_tasks
  26.         и следом присвой переменной tasks - копию default_tasks
  27.  
  28.     и в этом методе - делай такое же присваивание = заново заполни tasks
  29.     и затем верни get_tasks()
  30.  
  31.     посмотри на линки и комментарии в прошлом ревью
  32.     может, конечно, ты просто забыла обновить этот файлик в проекте)
  33.  
  34.     я в прошлом ревью не только про это писала
  35.     насчет rest-server.py
  36.     строки 3-38 прошлого ревью
  37.  
  38. */
  39. *****************************
  40. public static String uri = baseUri + "/todo/api/v1.0/tasks";
  41.  
  42. /*
  43.     все ок с реализацией Configuration.baseUri
  44.     конечно, стоит использовать
  45.     Configuration.baseUri
  46.     а не  baseUri
  47.  
  48.     наша цель тут - точность и понятность
  49.     используя Configuration.baseUri
  50.     мы подчеркнем - что это за величина
  51.     легче будет сообразить - что это важно
  52. */
  53. *************************************
  54.  
  55.     @Before
  56.     public void testReset() {
  57.         TasksApi.reset();
  58.         TasksApi.assertTasks(DEFAULT_TASKS[0], DEFAULT_TASKS[1]);
  59.         /*
  60.             если вынести вспомогательное предварительное действие
  61.             в @Before-метод - это в общем ОК
  62.             (плюсы и минусы этого решения - рассмотрели в прошлом ревью строки 403-415)
  63.  
  64.             то добавлять еще и assertTasks - точно перебор
  65.  
  66.             вспомни старые работы
  67.             когда и почему (или для чего)
  68.             мы после предварительных действий делали проверки
  69.  
  70.             только если тестим что-то большое и тормознутое
  71.             и если предварительные действия реализованы не надежно
  72.             разве у нас такой случай?
  73.  
  74.             кроме того
  75.             мы стремились - чтобы предварительное действие - ресет
  76.             никак не использовало основной функционал
  77.             который мы будем тестировать
  78.  
  79.             а если мы тут используем assertTasks
  80.             то получается - что еще на уровне предварительных действий
  81.             используем и тестируемое действие - get()
  82.             мы тут запросто обойдемся без assertTasks
  83.             это только улучшит наш код)
  84.  
  85.             еще важно
  86.             это - не тест-метод
  87.             это - бифор-метод - для создания тестовой ситуации
  88.             имя метода - не должно начинаться с test
  89.  
  90.             можно и єтот метод назвать reset()
  91.             и будет ОК
  92.  
  93.         */
  94.     }
  95. *********************************************************
  96.     @Test
  97.     public void testReadAll() {
  98.         //TasksApi.reset();
  99.         /*
  100.             в бифоре - вызвали ресет + гет
  101.         */
  102.         List<Task> actualTasks = TasksApi.get();
  103.         /*
  104.             и теперь проверяем гет)
  105.         */
  106.         assertEquals(Arrays.asList(DEFAULT_TASKS), actualTasks);
  107.     }
  108. /*
  109.     поправишь реализацию бифор-метода - и тут логика будет стройнее
  110.         в бифоре - сделали ресет = предварительные действия
  111.         в тест-методе - гет = тестируемое действие
  112.         и проверили результат
  113.  
  114.     все хорошо и красиво
  115. */
  116. ***************************************
  117. @Test
  118.     public void testUnauthorizedRead() {
  119.         Response response = RestHelpers.requestTo(uri).get();
  120. /*
  121.     тут без ущерба для кода - можно заимпортить RestHelpers.requestTo
  122.     и использовать просто requestTo
  123.  
  124.     конечно - это субъективно)
  125.  
  126.         я придерживаюсь такого принципа
  127.  
  128.         если слово слишком распространенное и/или контекст вызова не помогает это понять -
  129.         то уточняю до имени класса
  130.         или - если решили все статические методы этого класса вызывать указывая имя класса
  131.         (как мы про пейджи - когда их было несколько в проекте)
  132.  
  133.         иначе - использую import static
  134.  
  135.         так - например -
  136.         в селениде проектах - использовав кондишенов empty / visible -
  137.         мы использовали import static и не уточнялись
  138.         до имени класса - т к и так все понятно из контекста
  139.  
  140.         а вот By.name(...), String.join(... - я бы уточнялась до класса -
  141.         т к по одному имени метода непонятно - что за зверь
  142.         и тот кто код читает - будет вынужден посмотреть - что мы там наимпортили
  143.  
  144.         не настаиваю в данном случае
  145.         но ход мыслей вот такой)
  146. */
  147. ******************************************
  148.     @Test
  149.     public void testRead() {
  150.         Task task = authorizedRequestTo(uri + "/2").get().readEntity(TaskContainer.class).getTask();
  151.         /*
  152.             вот для этого - можно было бы в TasksApi реализовать Task get(int taskId)
  153.             заодно и код ответа в методе проверишь)
  154.         */
  155. *************************************************************
  156. public void testCreateTaskWithFullInformation() {
  157. /*
  158.     тут мы уточнялись до WithFullInformation - т к у нас было 2 варианта
  159. */
  160. ****************************************
  161. public void testUpdateFullInformation() {
  162. /*
  163.     а тут - у нас один вариант
  164.     потому можно и не конкретизироваться до FullInformation
  165. */
  166. **************************************
  167.     public void testUpdateFullInformation() {
  168.     public void testDelete() {
  169. /*
  170.     в обоих методах - используешь таску с ид=2
  171.  
  172.     разнообразь тесты)
  173.  
  174.     в одном методе - с первой поработай
  175.     во втором - со второй
  176.  
  177.     пойдет на пользу покрытию
  178. */
  179. ***********************************
  180. public void testCreateUpdateDelete() {
  181. /*
  182.     очень правильно - что тут поработала во всех шагах - с добавленной таской
  183.     т к в предыдущих тестах мы редактировали и удаляли дефолтную таску
  184.  
  185.  
  186.     тоже разнообразили тестовые ситуации
  187.     и улучшили покрытие
  188. */
  189. *****************************************
  190.     public static List<Task> get() {
  191.         return authorizedRequestTo(uri).get().readEntity(TasksContainer.class).getTasks();
  192.     }
  193. /*
  194.     И тут - аналогично другим методам
  195.     можно было бы и код ответа проверить
  196.  
  197.     но - наверное не стоит)
  198.     спорный такой момент
  199.  
  200.     т к мы гетом часто будем пользоваться при проверках
  201.     можно допустить - что раз так подробно и в разных ситуациях данные из ответа проверены - то все ок
  202.  
  203.     хотя - если это важно - про код ответа
  204.     то надо бы тут проверить
  205.  
  206.     аналогично как сейчас мы - в
  207.     тестах для обновления или создания таски - не проверяем таску, которую получаем в ответе
  208.     типа - раз проверили потом состояние тасок - значит ок
  209.  
  210.     тут - что проверять - надо по месту сориентироваться
  211.     чтоб и лишнего не делать
  212.     и важного не упустить
  213.  
  214.     от многого зависит
  215.     в том числе и от наличия юнит-тестов
  216.  
  217.     Яков писал об этом в слеке (в чате на нас троих)
  218.     если не видела - маякни
  219.    
  220.     осталось - не много
  221.     подравняй код
  222.     поработала отлично
  223.    
  224.     не забудь про код на питоне - приложи свежую версию)
  225. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement