您认为使用PyTest进行负载测试有什么可能? 例如:
import locust
class UsersTest(locust.TaskSet):
@locust.seq_task(1)
def api_get_task(self):
self.client.get("/api", name="GET /api") # Самое действие
@locust.seq_task(2)
def api_post_task(self):
payload = {"username": "user1", "password": "123456"}
self.client.post("/api", data=payload, name="POST /api")
class SituationTest(locust.HttpLocust):
task_set = UsersTest
min_wait = 1000
max_wait = 2000
host = "http://127.0.0.1:3000"
因此,这是2个网址的2个简单任务的示例。进入类UsersTest我有我的测试用例本身。进入现状测试我有我的参数。
那么问题是如何将这两个类集成到pytest固定装置装饰器中,并在test_file.py和conftest.py之间进行拆分?
答案 0 :(得分:0)
通过将单独的pytest测试添加为蝗虫任务的一种可行方法。
如果测试很简单并且不使用pytest固定装置,则可以导入所有测试函数(或类)并将其添加为任务。
Here是您可以以编程方式添加任务的方式。
产生的代码就是这种效果。
from test_module import test_a
from locust import TaskSet, HttpLocust
class TestTaskSet(TaskSet):
@task
def test_task(self):
self.schedule_task(test_a)
class WebsiteUser(HttpLocust):
task_set = TestTaskSet
如果您的测试代码使用固定装置,参数化等pytest功能,则可以使用pytest.main()
收集所有测试并将单个测试添加为任务并将其作为pytest测试执行。
例如
import pytest
from locust import TaskSet, HttpLocust, between
class TestCollector:
def __init__(self):
self.collected = []
def pytest_collection_modifyitems(self, items):
for item in items:
self.collected.append(item.nodeid)
test_collector = TestCollector()
pytest.main(['tests_dir', '--collect-only'], plugins=[test_collector])
class TestTaskSet(TaskSet):
@task
def task_gen(self):
for test in test_collector.collected:
self.schedule_task(pytest.main, args=[test])
class WebsiteUser(HttpLocust):
task_set = TestTaskSet
wait_time = between(1, 5)
此代码将使单个测试成为蝗虫任务。
答案 1 :(得分:0)
此外,您可以将 locust
用作库而不是 CLI。
import gevent
import locust
class UsersTest(locust.SequentialTaskSet):
@locust.task
def api_get_task(self):
self.client.get("/api", name="GET /api") # Самое действие
@locust.task
def api_post_task(self):
payload = {"username": "user1", "password": "123456"}
self.client.post("/api", data=payload, name="POST /api")
class SituationTest(locust.HttpUser):
task_set = UsersTest
min_wait = 1000
max_wait = 2000
host = "http://127.0.0.1:3000"
def test__your_pytest_example():
env = locust.env.Environment(user_classes=[SituationTest])
env.create_local_runner()
gevent.spawn(locust.stats.stats_history, env.runner)
env.runner.start(1, spawn_rate=1)
gevent.spawn_later(10, lambda: env.runner.quit())
env.runner.greenlet.join()
assert env.stats.total.avg_response_time < 60
assert env.stats.total.num_failures == 0
assert env.stats.total.get_response_time_percentile(0.95) < 100