如何为使用另一个函数作为数据源的函数编写自动化测试

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 的文件,其中包含两个函数,foobaz。 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 ==============================