在pytest-xdist下配合异步能实现对服务的自动化压测
因为在项目里,需要并发去执行测试用例,但是xdist在windows只能使用多进程,并且资源消耗比较大,本机20g内存,i5 8500cpu,在可用10g内存下,最多只能开十个左右的进程,就会内存溢出然后崩溃,所以在需要对服务进行自动化压测时,采用多进程是不可取的,而后又改为跑一个进程,在该进程下使用threading多线程,这样就可以极大节省系统资源,但是多线程也会加载整个目标函数,在同时执行自动化用例测试和压测(pytest多开)的情况下也容易出现内存溢出,所以直接将多线程部分改为异步执行,这样压测时,想开多少开多少(理想情况),因为压测需要执行指定时长,所以异步也可以单另开一个线程,在该线程下执行,下面贴上异步封装的代码:
封装异步
#这里直接对异步进行了二次封装,方便调用
import json
import asyncio
from aiohttp import ClientSession, ClientTimeout
def get_newloop():
return asyncio.new_event_loop()
async def tasks(datas, logger, message):
tasks = [asyncio.ensure_future(send_request(data, logger, message)) for data in datas]
return await asyncio.gather(*tasks)
async def send_request(data, logger, message):
try:
async with ClientSession() as conn:
async with conn.request(data['method'],data['url'],data=json.dumps(data['data'] if data.get('data') else None),
timeout=ClientTimeout(total=8)) as res:
return res.status
except:
logger.error(message)
def main(datas, logger, message,loop):
asyncio.set_event_loop(loop)
return loop.run_until_complete(tasks(datas, logger, message))