Тестирование формы на множестве данных в одной форме

Есть некая форма допустим с 3 полями, которые надо проверить на различные значения.
Есть методы, что-то вроде:

def fill_first_field(text)
def fill_second_field(text)
def fill_third_field(text)

Как организовать проверку поля 1? В него могут вводиться два валидных значения и одно нет, например ("", 50) - валидные, 51-невалидное (ограничение в базе 50 символов)
Пока есть только вот такая идея (код теста):

@pytest.mark.parametrize('valid',["",50])
test_valid_field1(self, valid)
  def fill_first_field(valid)
  def fill_second_field(u'Тестовое значение 2')
  def fill_third_field(u'Тестовое значение 3')
  какой-то assert

@pytest.mark.parametrize('notvalid',[51])
test_notvalid_field1(self, notvalid)
  def fill_first_field(notvalid)
  def fill_second_field(u'Тестовое значение 2')
  def fill_third_field(u'Тестовое значение 3')
  какой-то assert

@pytest.mark.parametrize('valid',["",100])
test_valid_field2(self, valid)
  def fill_first_field(u'Тестовое значение 1')
  def fill_second_field(valid)
  def fill_third_field(u'Тестовое значение 3')
  какой-то assert

И так для каждого поля…
Где хранить данные например Тестовое значение 2 и Тестовое значение 3???
Как можно еще организовать такие тесты???

Используется pytest, page_object(в какой-то виде))), selenium

Ну во первых, из вашего описания не понятно какой у вас контракт взаимодействия фронта и бека. И собственно архитектура приложения. Т.к. это влияет на архитектуру тестов.

Вариантов может быть несколько:
1 Фронт отсылает на бек данные как есть и получает ошибки валидации от бека (удобный вариант для автоматизации)
2 Фронт имеет свои валидации и только после проверки отсылает данные на бек.

Если у вас первый вариант, то UI тесты с webdriver’ом вам не нужны для проверки валидаций. Шлёте http запросы на бек с нужными тестовыми данными.
Если второй вариант, то посмотрите как у вас устроен UX, на каком этапе появляется ошибка валидации? Нужно ли вводить все 3 поля, чтобы её увидеть? Если да, то:
Сохраните 3 валидных значения и 3 не валидных в переменную класса.
У вас будет 6 тестов всего.

Проверять надо через GUi. Тесты для апи тоже написаны. Пока просто никак не реализована валидация на GUi. На стороне бэкенда запроса с невалидныии данными не пропусти бд(ну или что что то вокруг нее).
Если например ввести 51 символ в нужное поле и заполнить все остальное, то программа просто выдаст 400 ошибку при сохранении(отправки на сервер невалидного jsona)

  1. Почитайте про Pairwise, чтобы не гонять все варианты ваших полей, на основе какой-нибудь из утилит сгенерируйте наборы для негативных и позитивных случаев;
  2. На основе разработанных тестовых наборов из п1 - можно сгенерить результирующую таблицу, где в ячейках будут ваши значения для каждого поля и последнее поле - результат “passed” || “failed”;
  3. В итоге будут два теста - позитивный и негативный, в качестве параметров передадите распарсенную вашу таблицу (например из csv). А параметризацию попробуйте сделать как тут описано: How to parametrize fixtures and test functions — pytest documentation

Ну и Nikita верно спрашивает: если валидация на стороне сервера, то на фронте достаточно проверить, как он отображает ответ с сервера. Зачем гонять через UI?

ЗЫ: в Pytest не силен, и возможно мое видение не правильное, но по описанию задания звучит как-то так.

Я не в курсе, что есть в PyTest, в Java я бы использовал TestNG + DataProvider, который натравил бы на файлик. В файлике должны быть перечислены необходимые наборы значений, например, так:

“1”, “1”, “1”
“100”, “100”, “199”
Ну и т.д.

Спасибо за новый инстремент)) думаю поможет данные генерить

Все таки данные в файлике отдельном бы хранили?

Да. Это логически отдельный ресурс, не вижу смысла засорять код.

Если использовать pytest, то есть @pytest.mark.parametrize (Parametrizing tests — pytest documentation).

import pytest

from datetime import datetime, timedelta

testdata = [
    (datetime(2001, 12, 12), datetime(2001, 12, 11), timedelta(1)),
    (datetime(2001, 12, 11), datetime(2001, 12, 12), timedelta(-1)),
]

@pytest.mark.parametrize("a,b,expected", testdata)
def test_timedistance_v0(a, b, expected):
    diff = a - b
    assert diff == expected

Можно написать метод который будет в testdata возвращать тестовые данные. Фактически, получается аналог @DataProvider из Java.