Python单元测试运行方法直到某一点

Python单元测试运行方法直到某一点,python,unit-testing,Python,Unit Testing,我是Python测试新手,不确定这是否可行 我有一个相对较长的方法,它接受输入,进行一些处理,然后将数据发送到API 我想写一个测试,将输入的数据发送到测试,对数据运行处理,但不发送到API。所以基本上在方法中运行一定量,但不会一直运行到最后 不幸的是,我甚至不知道从哪里开始,所以我不能真正提供相关的示例代码-这只是一个标准的单元测试,它使用输入运行一个方法并断言输出。您采取了错误的方法。您要做的是执行与外部API函数调用隔离的测试。只需模拟API调用即可。这意味着,使用模拟方法替换API调用来

我是Python测试新手,不确定这是否可行

我有一个相对较长的方法,它接受输入,进行一些处理,然后将数据发送到API

我想写一个测试,将输入的数据发送到测试,对数据运行处理,但不发送到API。所以基本上在方法中运行一定量,但不会一直运行到最后


不幸的是,我甚至不知道从哪里开始,所以我不能真正提供相关的示例代码-这只是一个标准的单元测试,它使用输入运行一个方法并断言输出。

您采取了错误的方法。您要做的是执行与外部API函数调用隔离的测试。只需模拟API调用即可。这意味着,使用模拟方法替换API调用来运行测试。您不需要更改测试中的代码,您可以使用补丁装饰器将API调用替换为模拟对象。请参阅
unittest.mock
文档和示例

unittest.mock
功能非常强大,一开始看起来有点吓人,或者至少有点困惑。花点时间了解文档中可以使用mock执行的各种操作。这里有一个非常简单的例子,其中一个可能性(在一些测试代码中):

因此,您可能可以轻松绕过外部API调用(全部或部分调用)。如果不想,您不必指定API结果。模拟显示“塑料”行为


如果您创建一个mock并调用一个您甚至还没有定义的任意mock方法(想想您想要隔离的API方法),那么它将正常运行并返回另一个mock对象。也就是说,它什么也不做,但是它的客户机代码仍然会像它那样运行。因此,您可以运行测试,实际禁用所需的部件。

您采取了错误的方法。您要做的是执行与外部API函数调用隔离的测试。只需模拟API调用即可。这意味着,使用模拟方法替换API调用来运行测试。您不需要更改测试中的代码,您可以使用补丁装饰器将API调用替换为模拟对象。请参阅
unittest.mock
文档和示例

unittest.mock
功能非常强大,一开始看起来有点吓人,或者至少有点困惑。花点时间了解文档中可以使用mock执行的各种操作。这里有一个非常简单的例子,其中一个可能性(在一些测试代码中):

因此,您可能可以轻松绕过外部API调用(全部或部分调用)。如果不想,您不必指定API结果。模拟显示“塑料”行为


如果您创建一个mock并调用一个您甚至还没有定义的任意mock方法(想想您想要隔离的API方法),那么它将正常运行并返回另一个mock对象。也就是说,它什么也不做,但是它的客户机代码仍然会像它那样运行。因此,您可以运行您的测试,实际上禁用您想要的部分。

在我看来,您应该将您想要测试的代码片段提取到它们自己的函数中。这样你就可以测试你感兴趣的部分。在我看来,你应该把你想测试的代码片段提取到它们自己的函数中。这样你就可以测试你感兴趣的部分。问题不是他们想要测试的东西是调用不需要的API。问题是他们感兴趣的东西与他们不想执行的其他代码混合在一起。我认为这是OP一直在寻找的方法,但不知道模拟。只是为了更好地解释OP问题而编辑。问题不是他们想测试的东西是调用不需要的API。问题是他们感兴趣的东西与他们不想执行的其他代码混合在一起。我认为这是OP一直在寻找的方法,但不知道模拟。只是为了更好地解释OP问题而编辑。
@patch('myproject.db.api.os.path.exists')
def test_init_db(self, mock_exists):
     ...
     # my mock function call will always returns False
     mock_exists.return_value = False

     # now calls to myproject.db.api.os.path.exists
     # in the code under test act just like the db file does not exist
     ...