Python - 扩展 API 客户端类或传递实例

标签 python testing

我正在与我拥有 Python 库的 API 进行交互。该库提供了一个 APIClient 类,它提供了 API 的所有功能。我想根据一些逻辑与此 API 进行交互,并且我希望能够测试 wihtout 进行 API 调用(即模拟)的逻辑,因为它是事务性的。

很明显,我需要(在某个阶段)模拟 API 客户端的一些功能,但我不确定如何最好地处理这个问题。

我是否应该简单地扩展 APIClient 类,实现我的逻辑,然后再次扩展我的类以创建模拟版本:

class MyClass(APIClient):
   pass #Lots of interesting things actually happen here

class MyTestClass(MyClass):

   def an_overridden_method(self):
      pass #here I implement a method for testing

或者我应该将一个 APIClient 实例传递给我的类,当我想测试时,我应该传递一个模拟版本的 APIClient 类吗?

class MyClass(object):

   def __init__(self, api_client):
      self.api_client = api_client

class MockAPIClient(APIClient):

   def an_overwritten_method(self):
      pass

或者是否有替代的“最佳实践”方式让我实现它?

最佳答案

您通常不会模拟被测单元的某些部分。如果您正在测试 MyClass,您想要测试的一件事是它是否在真正应该这样做的时候创建和执行事务。在您的示例中,覆盖的方法将未经测试。

相反,您应该模拟实际会导致事务发生的层;将 SomeDatabaseApi.connectSomeDatabaseApi.Connection.startTransaction 等安排为实际模拟 stub ,以便被测单元仍会调用它们,但随后您可以看到如何他们后来被召唤。

可能有比您可能需要的更多的 python 模拟测试框架,但我很好地利用了 MiniMock ,它简单、有效且富有表现力。

关于Python - 扩展 API 客户端类或传递实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6959154/

相关文章:

testing - 缺陷和问题有什么区别?

python - 使用 sys.stdin 中的先前输入进行提示

python - 是否有与 Ruby 的 'any?' 函数等效的 Python?

scalacheck 案例类随机数据生成器

testing - 突变测试中的耦合效应是什么?

bash - 使用 kcov/shunit2 测量已执行 shell 脚本的代码覆盖率

python - 如何在 pymssql 中执行 .sql 文件

python - 整数除法总是等于正除法的下限吗?

python - 用户如何将自己的值添加到 dash_core_components.Dropdown 中?

ruby - 编写 cucumber 测试用例