python 如何确定Pytest循环操作中的休眠时间?

1hdlvixo  于 2022-10-30  发布在  Python
关注(0)|答案(1)|浏览(240)

我们想确认作业是否确实在Pytest中按预期在循环操作期间等待。我们在3次循环中将休眠时间设置为30秒--我们预期并证明在Pytest中总等待时间为90秒,如下所示。

-- Loop.py
class Loop

    def LoopJob(self, job_id, date, subject, fromDate, toDate):

        for error_count in range(3):
            try:
                request_url = 'http://' + self.hostname + '/samplejob'
                headers = {'content-type': 'application/json'}
                response = requests.post(request_url, data=json.dumps(payload), timeout=self.timeout, headers=headers)

            if response is None:
                time.sleep(30)
            else:
                break

        if response is None or response.status_code != 202:
            error_message = "error message on parent method"
            raise CommunicationError(error_message)

        return response

我认为我们可以像下面这样使用“request_history”来证明循环时间,但是不知道如何在pytest中Assert等待时间。

-- Pytest.py
def test_looptimes(monkeypatch, requests_mock):

monkeypatch.setenv('ENV_ID', 'Local')
headers = {'content-type': 'application/json'}
mock_response = [
    {'json': {'status': None}, 'status_code': None},
    {'json': {'status': None}, 'status_code': None},
    {'json': {'status': None}, 'status_code': None},
    {'json': {'status': None}, 'status_code': None}
]
requests_mock.post("http://localhost:8080/samplejob", headers=headers, json=mock_response)
...
history = requests_mock.request_history
assert len(history) == 3
assert history[0].url == 'http://localhost:8080/samplejob'
assert history[1].url == 'http://localhost:8080/samplejob'
assert history[2].url == 'http://localhost:8080/samplejob'

如果你有什么好的想法或例子,请告诉我们。提前谢谢。

cqoc49vn

cqoc49vn1#

您可以像模拟任何其他方法一样模拟sleep方法,然后Assert对它的调用。
举一个简单的例子,如果我的模块sleeping_beauty.py看起来像这样:

import time

def wait_for_my_hero():
    time.sleep(15)
    time.sleep(30)
    time.sleep(45)

测试将是(使用pytest-mock):

from sleeping_beauty import wait_for_my_hero

from mock import call

def test_wait_for_my_hero(mocker):
    my_sleep_mock = mocker.patch("sleeping_beauty.time.sleep")
    wait_for_my_hero()

    assert 3 == my_sleep_mock.call_count
    my_sleep_mock.assert_has_calls(calls=[call(15), call(30), call(45)])

模拟睡眠方法的另一个好处是,您的测试速度会快得多--完成测试所需的时间不会是90秒,而是不到一秒。

相关问题