Было последовательно выполнено создание пользователя, генерация для него пары ключей, аутентификация с использованием ключа, отзыв ключа и его удаление. Проверяется, что состояние системы меняется ожидаемым образом
Были намеренно переданы неверные идентификаторы, совершена попытка отозвать ключ с неверным UUID,было оборвано соединение на разных этапах операции. Проверяется, что система выдает сообщения об ошибках и не переходит в неопределенное состояние
Тесты были пройдены
Через панель управления создается правило: ”Отказать с создании дополнительного ключа аккаунту с высоким приоритетом”. Проводится имитация попытки создания ключа, проверка отказа в операции
Подобная операция была проведена с другими несколькими правилами:
| Правило | Действие |
|---|---|
(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) |
отказ в операции |
Все правила показали ожидаемые от них действия
Было проведено тестирование на нескольких данных. Тестировочные данные содержали данные с ошибками модели, некоторые представляли собой просто поток байтов.
| 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 милисекунд