Как запустить асинхронный HTTP-тест в Python с помощью pytest aiohttp
Я хочу протестировать http-вызов API, которым я не владею (интеграционный тест). Я создал класс с функцией async, которая выполняет HTTP-вызов с использованием aiohttp. Затем я создал тестовый пример, чтобы запустить эту функцию и подтвердить ее статус.
test / test_coinbase.py:
import json
import os
from aiohttp.test_utils import AioHTTPTestCase, unittest_run_loop
from src.coinbase import CoinbaseService
class CoinbaseTestCase():
async def test_get_current_user(self):
coinbase_service = CoinbaseService(os.getenv('COINBASE_APIURL'), os.getenv('COINBASE_APIKEY'), os.getenv('COINBASE_APISECRET'))
status, user = await coinbase_service.show_current_user()
assert status == 200
src/coinbase.py:
import json, hmac, hashlib, time
import aiohttp
class CoinbaseService:
def __init__(self, API_URL, API_KEY, API_SECRET):
self.API_URL = API_URL
self.API_KEY = API_KEY
self.API_SECRET = API_SECRET
def generateHeaders(self, method, path_url, body = ''):
timestamp = str(int(time.time()))
message = timestamp + method + path_url + body
signature = hmac.new(self.API_SECRET, message, hashlib.sha256).hexdigest()
headers = {
'CB-ACCESS-SIGN': signature,
'CB-ACCESS-TIMESTAMP': timestamp,
'CB-ACCESS-KEY': self.API_KEY
}
return headers
async def show_current_user(self):
path_url = 'user'
headers = self.generateHeaders('GET', path_url)
async with aiohttp.ClientSession() as session:
async with session.get(path_url, headers=headers) as response:
status = response.status
user = await response.json()
return status, user
Когда я запускаю следующую команду в своем корневом проекте, я получаю следующее.
платформа darwin - Python 3.7.4, pytest-5.3.5, py-1.8.1, pluggy-0.13.1 rootdir: /Users/helloworld/ плагины Krypto: aiohttp-0.3.0 собрано 0 элементов
Пакеты
[packages]
aiohttp = "*"
backoff = "*"
requests = "*"
asyncio = "*"
vadersentiment = "*"
python-dateutil = "*"
pytest = "*"
pytest-aiohttp = "*"
1 ответ
CoinbaseTestCase
не соответствует умолчаниюpytest
Правила именования, которые следует рассматривать как тестовый класс, см. в разделе " Соглашения об обнаружении тестов Python". Либо переименуйте класс в что-то вродеTestCoinbase
, или определите свои собственные соглашения об именах.Ваниль
pytest
не поддерживает запуск асинхронных тестов. Установитьpytest-asyncio
:$ pip install pytest-asyncio
и отметьте асинхронные тесты
asyncio
маркер:class TestCoinbase: @pytest.mark.asyncio async def test_get_current_user(self): await coinbase_service.show_current_user() ...