Добрый день! Такая проблема…есть дроп даун лист с формулами…мне надо выбрать формулу каждую (а их штук 30) и проверить с каждой формулой вычисления…Если бы у меня было хотя бы пять формул …я бы создавал на каждую формулу метод который бы кликал на дроплист и выбирал формулу по икспасу или по порядку(5 было бы)… но у меня 30 формул и 30 методов не хотелось бы создавать… может кто поможет …как можно написать один метод но потом просто подставлять разные например икспасы айтемов из листа ?? Я использую Selenium, WebDriver, Java, testNG
Вот кусочек кода с дропдаун листом и формулами (5 формул кинул только , а то список был бы большим=))
Твой вопрос - простейший пример DDT (data driven test). То есть когда одна и та же проверка должна быть проделана для множества различных значений.
Что здесь можно сделать:
Во-первых, необходимо вспомнить теорию тестирования, а конкретно domain testing, классы эквивалентности и т.д. И прежде чем тупо тестировать все подряд значения, подумать, нельзя ли их проверить, выбирая по одному из эквивалентных интервалов
Если п. 1 учтен и сделан сознательный выбор тестирования всех значений методом перебора, то у TestNG есть для этого механизм, называемый DataProvider (см ссылку)
Рандом применять нужно очень осторожно и осознанно. Потому что один из критериев хорошего теста (в т.ч. автоматического) - это повторяемость. А если падать тест будет только на каком-то одном значении, выбираемом рандомно из многих, то это плохой тест
Этот дроп даун лист задаёт формулу … по которой я должен сделать обчисления… но на каждую формулу я должен сделать хоть один тест… после выбора формулы меняется и сама форма, и поля… и рандомный выбор формул я считаю не подходит…
Не разглядел что нужна каждая. Тогда можно просто сделать цикл. Который будет кликать на каждую формулу по-порядку или начиная с какой-то как вам нужно.
На питоне будет что-то вроде
for i in driver.find_element_by_id("formula_select").find_elements_by_tag_name("option"):
i.click()
То есть здесь элемент i будет одной из ваших формул, а дальше вы можете сами сделать что угодно с ними, например вытащить атрибут value или текст выпилить и т.д и т.п. Или по вашей задаче выполнять нужные действия.
for i in driver.find_element_by_id("formula_select").find_elements_by_tag_name("option"):
i.click()
Здесь в for цикле просто выводится вырезка всех элементов - формул. Вне зависимости сколько их там. Теперь каждый i - элемент это формула.
Если непонятно почитайте что такое for цикл в нужном языке программирования.
Дальше вы можете сделать так.
for i in driver.find_element_by_id("formula_select").find_elements_by_tag_name("option"):
------- здесь клик на дропдаун ---------
i.click() // клик на формулу
------- здесь методы которые нужно выполнить после клика на формулу-------
Как вы собираетесь писать один метод, если для каждой формулы форма и поля меняются?
Если тело тестовой страницы всегда разное, то для тестирования 30 формул придется писать 30 тестов.
Ваша задача сформулирована не до конца. Соответственно и ответы вам привели, исходя из условия.
Если бы сценарий был всегда идентичный (одинаковые шаги), а менялись лишь данные, можно было бы (как уже подсказали выше) применять DataProvider механизм. Но суть ваших тестов то не просто в выборе формулы из списка, а и в подстановке параметров с последующими вычислениями.
Итого, у вас будет 30 методов, для которых придется подключать DataProvider, которому в свою очередь придется скормить N тестовых данных (для каждого теста), базирующихся на классах эквивалентности. Другими словами, на выходе у вас будет 30 методов, каждый из которых циклически будет подставлять новые данные в свою формулу.
П.С. Т.к. формулы бывают разные (по числу / типу параметров), а протестировать нужно все, вариант с 1 методом не прокатит.
Есть еще один вариант - смоделировать бизнес-логику на основе требований. Да затратно, да рискованно, но иногда необходимо, если количество степеней свободы слишком велико.
Ну если “грубо” - взять формулу из ddl, распарсить, вычислить, сравнить expected с actual.
Но мне видится, что проблема у ТС много проще, а мы забегаем сильно далеко вперед