Тестирование ACR IdM

Функциональное тестирование

Тестирование базовых функций

  1. Было последовательно выполнено создание пользователя, генерация для него пары ключей, аутентификация с использованием ключа, отзыв ключа и его удаление. Проверяется, что состояние системы меняется ожидаемым образом

  2. Были намеренно переданы неверные идентификаторы, совершена попытка отозвать ключ с неверным UUID,было оборвано соединение на разных этапах операции. Проверяется, что система выдает сообщения об ошибках и не переходит в неопределенное состояние

Тесты были пройдены

Тестирование вводимых правил

  1. Через панель управления создается правило: ”Отказать с создании дополнительного ключа аккаунту с высоким приоритетом”. Проводится имитация попытки создания ключа, проверка отказа в операции

  2. Подобная операция была проведена с другими несколькими правилами:

Правило Действие
(Key.Active == true && Key.Lifetime > 0) || (Key.Active == false && Key.Lifetime == 0) отказ в операции
(User.Priority >= 1 && User.Priority <= 3) && (User.Lifetime > 0 && User.Lifetime < 3600) отказ в операции
(Key.ServerName == "main" || Key.ServerName == "backup") && Key.PublicKey != "" блокировка ключа
(User.Priority > 5 && User.Active == true) || (User.Priority <= 5 && User.Active == false) отказ в операции
(Action == 0 || Action == 1 || Action == 2) && Key.Active == true && User.Active == true отказ в операции
Key.UserID == User.ID && (Key.Lifetime > 0 || User.Lifetime > 0) блокировка аккаунта
(Action == 3 || Action == 4) && (User.Priority >= 5 && Key.ServerName != "test") отказ в операции
(User.Priority >= 8 && User.Lifetime >= 86400) || (User.Priority < 8 && User.Lifetime < 86400) отказ в операции
Key.Active == true && (Key.PublicKey != "" || Key.ServerName != "") && Key.Lifetime > 3600 блокировка ключа
(Action == 5 && Key.Active == false) || (Action != 5 && Key.Active == User.Active) отказ в операции

Все правила показали ожидаемые от них действия

Тестирование API

Было проведено тестирование на нескольких данных. Тестировочные данные содержали данные с ошибками модели, некоторые представляли собой просто поток байтов.

Payload Ожидаемый результат Действительный результат Пройден ли тест
payload-0.json Статус 200 Статус 200 Да
payload-1.json Статус 400 Статус 400 Да
payload-2.json Статус 400 Статус 400 Да
payload-3.json Статус 200 Статус 200 Да
payload-4.json Статус 400 Статус 500 Нет
payload-5.json Статус 400 Статус 400 Да
payload-6.json Статус 200 Статус 200 Да
payload-7.json Статус 200 Статус 200 Да
payload-8.json Статус 400 Статус 400 Да
payload-9.json Статус 400 Статус 400 Да
payload-10.json Статус 200 Статус 200 Да
payload-11.json Статус 200 Статус 200 Да
payload-12.json Статус 400 Статус 400 Да
payload-13.json Статус 200 Статус 200 Да
payload-14.json Статус 400 Статус 400 Да
payload-15.json Статус 200 Статус 200 Да
payload-16.json Статус 200 Статус 200 Да
payload-17.json Статус 400 Статус 400 Да
payload-18.json Статус 400 Статус 400 Да
payload-19.json Статус 200 Статус 200 Да
payload-20.json Статус 400 Статус 400 Да
payload-21.json Статус 200 Статус 200 Да
payload-22.json Статус 400 Статус 400 Да
payload-23.json Статус 200 Статус 200 Да
payload-24.json Статус 200 Статус 200 Да
payload-25.json Статус 400 Статус 400 Да
payload-26.json Статус 400 Статус 400 Да
payload-27.json Статус 200 Статус 200 Да
payload-28.json Статус 200 Статус 200 Да
payload-29.json Статус 400 Статус 400 Да

Таким образом, пройдено 97% предложенных тестов

Нефункциональное тестирование

Было проведено нефункциональное тестирование с целью оценить соответствие продукта нефункциональным требованиям. Нагрузочное тестирование проводилось с использованием запросов из предыдущего пункта:

import
                asyncio
            import
                aiohttp
            import
                json
            
            async def
                main():
             # testing-service заменяет IP в
                /etc/hosts
             url = "http://testing-service:8000/query" 
             async with
                aiohttp.ClientSession() as session:
             tasks = []
             for i in range(100):
             with open(f'payload-{i
                % 30}.json', 'r') as
                f:
             payload = json.load(f)
             
             tasks.append(session.post(url, json=payload))
             
             responses = await asyncio.gather(*tasks, return_exceptions=True)
             
             for i, response
                in enumerate(responses):
             if isinstance(response, Exception):
             print(f"Request {i}
                failed: {response}")
             else:
             print(f"Request {i}:
              {response.status}")
            
            asyncio.run(main())

Выполнение и обработка всех запросов произошло за 48 секунд

Тестирование времени развёртывания

С помощью внутренних средств Docker с момента запуска сборки контейнера до полной готовности системы к приёму запросов без учёта получения образа системы контейнера и дополнительных средств с репозитория.

С момента запуска развёртывания до обработки первого запроса прошло 40 секунд 35 милисекунд