Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

pytest API, как определить assert в зависимости от профиля

assert
pytest
python
Теги: #<Tag:0x00007f7b63920708> #<Tag:0x00007f7b639202a8> #<Tag:0x00007f7b639200f0>

(Viktor Kliui) #1

Добрый день ув. форумчане. Есть ряд тестов, грубо говоря юнит тестов через API интерфейс. В системе существуют разные роли и в зависимости от роли которая выполняет, будет разный респонс. Вот пример одного из тестов:

@pytest.mark.usefixtures('credential', 'clear_routes')
class Test_Routes:

    @allure.feature('Позитивный тест')
    @allure.story('Получаем информацию по роуту')
    def test_get_route(self, add_route, make_request):
        url = URL.route
        # Делаем запрос и получаем ответ
        data =  {"agentNumber": "1022","page_size":10,"page_number":1}
        response = make_request(method = "GET", url=url, params=data)
        #Формируем ожидаемый ответ
        answer = _.get_JSON_response('get_route', **add_route)
        #Сравниваем полученый response с ожидаемым
        assert response.status_code == 200
        assert answer == response.json()

Тест выполняется от root пользователя, если я буду выполнять от user пользователя, пришел бы ответ “user have no permissions”. Тесты от разных пользователей буду прогонять в разных job в jenkins. Авторизация - basic, то есть один профиль = header.

Вопрос как правильно организовать профили. В каждом тесте нужно использовать assert в зависимости от профиля.


#2

а не хочешь добавить какой то параметр типа юзер?
сам твой тест будет проверять перед тестом есть ли локальная переменная если есть то берем ее, а если нет то дефолтная.

environment = ['root', 'simple', 'super_root'][0] if 'TEST_ENV' not in os.environ.keys() else os.environ['TEST_ENV']

и создать обьект в котором будут ключи как значение environment по которым будет список тех переменных какие нужно асертить.

в каждой джобе перед тестом сетить значение TEST_ENV


#3

Нужно запустить тесты под непривелигированным пользователем? Если можно поднять права, то попробуй тесты запускать через sudo -H -u


(Oleg Kuzovkov) #4

Assert можно завернуть в какие то @step методы, в которых прохендлите развязку проверки (если она у вас на глобальном уровне). А если нет, тогда выводите ожидаемые результаты в дата соурсы, где спец методом будете вынимать в зависимости от типа пользователя.


(Viktor Kliui) #5

Assert можно завернуть в какие то @step методы, в которых прохендлите развязку проверки (если она у вас на глобальном уровне).

А можете обьяснить на примере, вот именно это я и думал, вот только не знаю как реализовать.

Датасоурсы не вариант, у меня сразу формируется allure отчет и мне сразу нужно понимать прошел или завалился тест.


(Viktor Kliui) #6

Вы не так наверно поняли, у меня в моем продукте есть распределение по ролям: User, Root, Administrator, Supervisor + можно самому создать пользователя с определенным набором прав, вот нужно авто тестами проверить правильно ли работают права.


(Прокопук Дмитрий) #7

Используйте параметризацию
‘user’, ‘expected_result’
Тест то один и тот же и вы стучитесь в один и тот же enвpoint, просто разными юзерами, так ведь?


(Viktor Kliui) #8

Да, все верно, но очень много кода + я использую параметризацию для тестовых данных в некоторых тестах.


(Прокопук Дмитрий) #9

да наооброт кода минимум
пример
@pytest.mark.parametrize(‘user’, ‘exp_res’,[(User, exp1),(root, exp2), (admin, expe3), (superuser,exp4)]
def test_user_assert:
params = {}
response = http_method.get(endpoint, user, headers, params)
assert response.json()==exp_res
Вот и весь ваш код на 5 юзеров


(Viktor Kliui) #10

Хочу всех поблагодарить, я решил данную задачу след образом:

В Jenkins сделал параметризированную сборку, передаю параметр (юзера от которого хочу запустить тест). В проекте есть 4 системные коли (user, root, administrator, supervisor)

Потом в тесте считываю данный параметр, вот как приблизительно будет организованно:

def auth_with():
    jenkins_param = os.environ['profile']
    profiles = {'user':('login', 'password'),
                'root':('login', 'password'),
                'administrator':('login', 'password'),
                'supervisor':('login', 'password')}
    if jenkins_param in profiles.keys():
        return jenkins_param, profiles[jenkins_param]
    else:
        return jenkins_param, profiles['root']

А в тесте перед ассертами будет проверка:

if jenkins_param == 'root':
    assert foo == True

if jenkins_param == 'user':
    assert foo == False

(Viktor Kliui) #11

Мне не один тест от разных юзеров нужно, а все АРІ тесты от разных юзеров, где будут разные ответы в зависимости от используемого профиля.