
Sergey
20.03.2017
10:46:09
да
для него сета нет
но если в масиве
метод сет есть

Google

Sergey
20.03.2017
10:46:40
и если искать через find тогда селектор такой ненайдет

Shoo
20.03.2017
10:47:24
Ещё раз. Ошибка
> method set undefined
Говорит нам о том, что у элемента, который лежит в массиве под индексом [0] нет такого метода.

Sergey
20.03.2017
10:47:25
вот вам ангуляровская форма

Shoo
20.03.2017
10:47:51
Значит надо смотреть, что за элемент там лежит, и, вероятно, или искать нужный вместо того, что находится, или использовать другой метод. :)
Дебажить, дебажить и ещё раз дебажить.

Sergey
20.03.2017
10:48:38
ты имеешь ввиду ("input[name='email']", :match => :first)

Shoo
20.03.2017
10:50:05
Я имею ввиду посмотреть, для начала, что тебе приходит в ответе page.all("input[name='email']")[0]
Дальше исходя из того, что там приходит - смотреть, нужный ли это элемент и работать с его методами.

Sergey
20.03.2017
10:50:39
в вебките например все ок с [0]

Evgeniy
20.03.2017
10:51:44
дело не в том, КАК ты написал код
дело в том, что Shoo говорит, что на всяких null объектах едвали set метод есть
или что тебе там вернулось в массиве по запросу на данный селектор

Sergey
20.03.2017
10:54:41
ооо

Google

Sergey
20.03.2017
10:54:45
а я сейчас посмотрю
undefined method `set' for #<Capybara::Result:0x007fc438a6bb80>

Evgeniy
20.03.2017
10:57:53
http://www.rubydoc.info/github/jnicklas/capybara/master/Capybara/Result

Sergey
20.03.2017
11:20:04
сейчас пошуршим

Egor
20.03.2017
11:29:08
Народ! А нет ли у кого электронного варианта книги "закон малинового варенья" ?

Vir
20.03.2017
11:46:55
коллеги, а насколько кошерно при написании автотестов для API, использовать это же API для напсания тестов, например:
необходимо протестировать метод API для удаления записи. Перед этим запись надо создать, правильно ли для создания записи использовать метод API, а затем, другим методом удалять эту запись.

Кирилл
20.03.2017
11:49:58
Тесты должны быть атомарны, т.е нужно разделить и тестировать каждый метод отдельно.
Можно, конечно прогонять самые длинные пути прохождения данных, но это уже перед выпуском. А в данном случае, нужно разделить, ибо это два разных кейса.

Vir
20.03.2017
11:50:59
вот, я так и думал, спасибо

Shoo
20.03.2017
11:54:45
Ну, при этом prepare statement с использованием апи - это нормально, но тест на создание юзера это не исключает.


Evgeniy
20.03.2017
11:54:49
если ты тестируешь API, и, например, метод DELETE сущности, то нет ничего плохого в том, что этот же POST метод будет создавать сущность.
В этом случае есть 2 подхода:
1) Вы компенсируете наполненость данными за счет того, что где-то у вас есть тест на создание объекта. А в тесте на удаление вы случайно получаете какой-то объект, который будете удалять.
2) Вы непосредственно перед тестом в дата-провайдере создаете объект через API, и сразу же его удаляете.
первый случай хорош тем, что при таком подходе не будет выполняться лишних операций по созданию моделей. Но это в свою очередь накладывает необходимость в привычке запуска тестов сьютами, для поддержания тестовой консистентности базы данных нужными тебе данными
второй - противоположен по профиту и проблемам: гарантия того, что тестируемая модель вообще будет для теста, но это лишнее время для работы, НО изолированность от полноты БД


Shoo
20.03.2017
11:59:50
Тестовые данные для тестов лучше всегда готовить перед тестом, имхо, т.к. позволяет удобно работать с этими данными.
Вариант "передавать данные из другого теста" плох тем, что добавляет лишнего рандома в тестируемой сущности.

Nikita
20.03.2017
12:05:29
передавать данные это боль, не надо так

Evgeniy
20.03.2017
12:06:37
"добавляет лишнего рандома в тестируемой сущности" - например?
На прошлом месте работы у нас был датапровайдер, который мог для слоя DB или API запрашивать для теста сущность типа:
Db().User().withStatus(1).hasFollowers(1).hasFollowings(1).withAlias('Mordor').getRandomRow()
или
Api().Firm().getFirm().withFilialID('123445678').getRandomRow()
т.е. такая ORM и API с гарантировали, что по заданному критерию будет находиться случайная сущность с запрошенными данными + такая сущность будет на сессию (запуск тестов из консоли, один процесс) будет исключать эту сущность из выборок, чтобы исключить неконсистетность тестов при параллельном запуске и рейс-кондишенах.

Shoo
20.03.2017
12:07:45
Если ты берешь "чужие" данные - у тебя добавиляется к этому вариант "взятые для теста данные аффектят выполнение теста".


Кирилл
20.03.2017
12:08:55
Автотесты же на статичных исходных данных делать красиво, зачем лишний рандом? Какие-то выборки, которые могут не прокатить и сиди, думай, что же там сломалось.

Evgeniy
20.03.2017
12:08:58
так а что мешает посмотреть, с каким именно набором упал тест? :) рандомные данные для заданного критерия никак не ухудшают дебаг и тестирование, конкретный датасет будет виден в логах

Кирилл
20.03.2017
12:09:55

Google

Evgeniy
20.03.2017
12:10:20
логи, ребята, в логах всё есть :) берешь потом и в Postman проверяешь. А захардкоженные данные плохи тем, что ты не можешь на 100% быть уверен, что в результате тестирование и мейнтенанса, при доступе несолкьих QA к одной БД - поведение и ожидаемый набор тестовый не перестанет быть чем-то, чем ты хотел чтоб он был изначально
ключевое слово "независимые" - в реальности это не всегда так

Shoo
20.03.2017
12:10:48
Это тратит время.

Evgeniy
20.03.2017
12:11:19
ты точно так же будешь смотреть и дебажить любой другой тест, наверное, вы просто не поняли идеи

Sergey
20.03.2017
12:11:36
короче , что то у меня невыходит никак

Shoo
20.03.2017
12:11:41
Тесты всегда должны выполняться в условиях полной ясности, иначе результат тестирования не репрезентативен.

Кирилл
20.03.2017
12:12:01

Evgeniy
20.03.2017
12:12:01
https://www.slideshare.net/VLDCORP/rest-api-49205514
посмотрите кому интересно

Shoo
20.03.2017
12:12:30
Брать рандомные данные то же самое, что запускать тесты в рандомной версии рандомного браузера.

Shoo
20.03.2017
12:12:49
Работает, но при падении сложнее отдебажить проблему.

Evgeniy
20.03.2017
12:12:54
нет

Shoo
20.03.2017
12:13:30
Да.

Sergey
20.03.2017
12:13:35
если ты незнаешь свои тесты тогда тебе и дебажить тяжело
сделай дебаг нормальный и все будешь понимать

Shoo
20.03.2017
12:14:54

Sergey
20.03.2017
12:15:23
у меня рандомные условия и я сделал дебаг на каком условии оно падает
сделал метки и путсы

Google

Sergey
20.03.2017
12:15:50
ребят
чет я совсем скис, никак не ищет метод find селектор
как будто его нет
я аж завис

Evgeniy
20.03.2017
12:18:00
@azshoo посмотри все же слайдики :) если лень, то особенность такого полхода в том, что требования к данным:
- реальные
- случайные, но однородные
- уникальные
особенность реста - он не должен работать для одного сета, он должен работать на многих :) за счет однородных, но уникальных данных мы нашли баги, которые не нашлись никогда бы за счет хардкода
на миллионе пользователей, миллионах их данных - ты бы не попал на такие кейсы в принципе.

Shoo
20.03.2017
12:30:18

Admin
ERROR: S client not available

Shoo
20.03.2017
12:33:12
Тебе ненадо тестировать миллионы данных и миллионы пользователей, тебе надо тестировать те данные, которые влияют\меняют юзерфлоу.
Подход ясен, понятен и привлекателен, только на миллионе тестов ты задолбаешься дебажить - это у тебя пользователь кривой, тест кривой или два прогона\сьюта\теста\степа назад этот кусок потрогал и сломал другой тест.


Evgeniy
20.03.2017
12:33:48
рандом плохо, когда твои данные не отображают твою ментальную модель для тестирования, т.е. твой сценарий например "пользователь с 100 отзывами (появляется расчет рейтинга, floating statistics) и больше чем 1 отзывом к одному предприятию (2 отзыва не считаются в статистике, считается последний) - вот это - твоя тестовая модель. Ей должно быть по барабану, кто это будет из тысячи пользователей
я не задолбаюсь дебажить. потому что при падении теста это дебажить воспроизведением в постмане с уютненьким json который можно скопировать из терминала и в ставить в body запроса
время на воспроизведение: 10 секунд. Время на дебаг с этого шага ничем не отличается от любых хардкод данных. Логирование тестов тут вообще не причем.
printf пофигу, хардкод или случайные данные в датапровайдере выводить :)


Shoo
20.03.2017
12:36:46
Так. Ещё раз.
Если у тебя есть заранее готовая тестовая модель (чистая), то у тебя есть два варианта падения - неактуальный тест или баг.
Если у тебя модель dirty - таких вариантов больше по умолчанию.
Больше вариантов -> дольше дебажить. Довольно очевидно, нет?
И это, к слову говоря, мы говорим о false negative сценарии. false positive за счёт кривых данных тоже никто не отменял.
Тестовые данные - это всегда прозрачная модель.
Мы же не пишем, вроде, в тестовой документации "сделай чо-нить и проверь, что работает".
Вот рандом в данных - это "пошли что-нибудь".
Истории с миллионами пользователей и миллионами данных, и багами которые это плодит нужно решать по другому.


Evgeniy
20.03.2017
12:44:12
Больше вариантов -> дольше дебажить. Довольно очевидно, нет?
нет, для случая описанного мной - это не проблема.
"Вот рандом в данных - это "пошли что-нибудь".
и опять это не тот случай. в таком подходе используются набившие всем оскомину классы эквивалентности и граничные значения. Данные случайны в пределах корректности. Например, ты тестируешь форму, и в ней нельзя писать 5 символов подряд. Ты на своем кейсе проверяешь хардкод из 'aaaaa', метод, который лучше - проверить, что это будет работать всегда на любом asci символе.
"Тестовые данные - это всегда прозрачная модель"
воистину, и это не перечит тому, что запрашивая данные под конкретный кейс мы получаем прозрачные данные :) QA не приходится зашиваться на юзера, на котором работет тест и он зеленый, появляется уверенность, что так работает со всем набором юзеров :)

Google

Shoo
20.03.2017
12:46:34
Нет, не появляется.
Появляется только уверенность, что на рандомном юзере это работает, и всё.

Evgeniy
20.03.2017
12:47:27
как часто вы тестируете на бою? или у вас дампы базы данных? А что если пользователь на котором вы тестируете, удалится?
"но я тестирую на созданных данных только для теста, никто их не трогает, кроме меня!" - но тогда это не реальные данные, и это совсем другая история.

Shoo
20.03.2017
12:47:53
Я готовлю тестового пользователя специально для теста.
Нету никакого тестовго пользователя X
Это обычный prepare statement. Есть тест, начинающийся с определенного шага - есть фабрика, которая готовит соответствующее состояние системы.
И нет, я не гоняю автотесты на боевых серверах (а зачем?), только дампы продакшена и production-like окружение.

Sergey
20.03.2017
13:11:25
ребят, я по поводу прошлой проблеме
есть метод find
xpath and css селекторы не находит
а методом page.all не сетит
напомню selenium => capybara => ruby

Evgeniy
20.03.2017
13:13:02
грустно это :(

Sergey
20.03.2017
13:18:34
да капец
вот два вопроса меня мучают целое утро
проверка на загрузку ангуляра на странице
и заполнение в самом селениуме

Shoo
20.03.2017
13:19:14
Посмотри как это сделано в protractor и скопипасть.

Sergey
20.03.2017
13:27:44
да