如何为使用另一个函数作为数据源的函数编写自动化测试
How to write automated tests for a function that uses another function as a source of data
我正在开发一个名为 MTP 的自定义 TCP 协议的小型客户端 - 模因传输协议(但这无关紧要)...问题是我永远无法让自己编写测试,因为它看起来很无聊而且毫无意义费时(实际上我知道,这一切只是我的懒惰)。但是现在我的应用程序中有一个功能,我质疑它的行为,所以我想测试它。
问题是我不知道怎么做,因为有一行函数从另一个辅助函数接收数据,它只是作为套接字通信的解析器(我正在使用带有 netstrings 的 TCP“加密”)字符串。
谁能告诉我 advice/ideas 如何进行这种测试? 这对我来说真的很困惑,我本可以想到的潜在解决方案似乎太多了困难,他们根本不值得进一步思考。
(我没有附上我的代码,因为它很长,但我非常愿意根据需要分享它)
因此,如评论中所述,如果您可以重构代码并在构建时考虑到测试,您的生活将会轻松得多。如果您不能重构代码并需要测试您当前拥有的代码,那么您可以考虑 mocking/patching 对其他函数的调用。由于您没有在下面显示您的代码,因此是一个示例。我有一个名为 Whosebug.py 的文件,其中包含两个函数,foo
和 baz
。 foo 将调用 baz,baz 通常会要求用户输入并将其转换为 int。在我们的测试中,我们想模拟函数 baz 而不是等待用户输入。
在您的情况下,您可以将此视为您的 tcp 函数,而只是将其模拟为 return 您想要的任何数据。在我的例子中,foo 取一个数字并将其添加到任何数字 baz returns。我将 baz 模拟为 return 一个随机数并检查 foo return 是否符合我的预期。
from random import randint
def foo(num: int):
return baz() + num
def baz():
return int(input("num: "))
def test_foo_baz_num_valid(mocker):
rand_num = randint(1, 100)
base_num = 10
baz_mock = mocker.patch("Whosebug.baz")
baz_mock.return_value = rand_num
assert foo(base_num) == base_num + rand_num
输出
Testing started at 21:57 ...
Launching pytest with arguments Whosebug.py --no-header --no-summary -q in C:\Users\cdoyle5\PycharmProjects\Whosebug
============================= test session starts =============================
collecting ... collected 1 item
Whosebug.py::test_foo_baz_num_valid PASSED [100%]
============================== 1 passed in 0.40s ==============================
我正在开发一个名为 MTP 的自定义 TCP 协议的小型客户端 - 模因传输协议(但这无关紧要)...问题是我永远无法让自己编写测试,因为它看起来很无聊而且毫无意义费时(实际上我知道,这一切只是我的懒惰)。但是现在我的应用程序中有一个功能,我质疑它的行为,所以我想测试它。
问题是我不知道怎么做,因为有一行函数从另一个辅助函数接收数据,它只是作为套接字通信的解析器(我正在使用带有 netstrings 的 TCP“加密”)字符串。
谁能告诉我 advice/ideas 如何进行这种测试? 这对我来说真的很困惑,我本可以想到的潜在解决方案似乎太多了困难,他们根本不值得进一步思考。
(我没有附上我的代码,因为它很长,但我非常愿意根据需要分享它)
因此,如评论中所述,如果您可以重构代码并在构建时考虑到测试,您的生活将会轻松得多。如果您不能重构代码并需要测试您当前拥有的代码,那么您可以考虑 mocking/patching 对其他函数的调用。由于您没有在下面显示您的代码,因此是一个示例。我有一个名为 Whosebug.py 的文件,其中包含两个函数,foo
和 baz
。 foo 将调用 baz,baz 通常会要求用户输入并将其转换为 int。在我们的测试中,我们想模拟函数 baz 而不是等待用户输入。
在您的情况下,您可以将此视为您的 tcp 函数,而只是将其模拟为 return 您想要的任何数据。在我的例子中,foo 取一个数字并将其添加到任何数字 baz returns。我将 baz 模拟为 return 一个随机数并检查 foo return 是否符合我的预期。
from random import randint
def foo(num: int):
return baz() + num
def baz():
return int(input("num: "))
def test_foo_baz_num_valid(mocker):
rand_num = randint(1, 100)
base_num = 10
baz_mock = mocker.patch("Whosebug.baz")
baz_mock.return_value = rand_num
assert foo(base_num) == base_num + rand_num
输出
Testing started at 21:57 ...
Launching pytest with arguments Whosebug.py --no-header --no-summary -q in C:\Users\cdoyle5\PycharmProjects\Whosebug
============================= test session starts =============================
collecting ... collected 1 item
Whosebug.py::test_foo_baz_num_valid PASSED [100%]
============================== 1 passed in 0.40s ==============================