python - 单元测试设计和模拟

标签 python unit-testing testing mocking automated-tests

假设我有以下类(class)并且我想测试它。

class SearchRecommended:
    def __init__(self, request2template):
        self._r2t = request2template

    def handle(self, request: Request):
        return request.user().queries().add_recommendation_query().run(1).print(
            RecommendedSearchMedia(self._r2t(request))
        ).message(RecommendedSearchMessage)

.user()返回的对象属于User “接口(interface)”和数据库相关。

class User(Equalable, ABC):
    @abstractmethod
    def user_id(self):
        pass

    @abstractmethod
    def lang(self):
        pass

    @abstractmethod
    def queries(self) -> "UserQueries":
        pass

    @abstractmethod
    def subscriptions(self) -> "UserSubscriptions":
        pass

    @abstractmethod
    def notifications(self) -> "UserSubsNotifications":
        pass

    @abstractmethod
    def access(self) -> "UserAccess":
        pass

    def repr(self):
        return self.user_id()

UserQueries , UserSubscriptions , UserSubsNotifications , UserAccess也是数据库交互类的基类。

据我所知,单元测试应该是快速的,不应该使用实际的数据库连接。 单元测试也不应该太了解它们正在测试的代码的内部结构。

模拟整个数据库交互层是乏味的,但只模拟被测试方法中使用的方法似乎对内部代码“了解太多”。

我的代码不应该在 .handle 中吗?方法可以自由地从 User 调用它喜欢的任何方法接口(interface)(或它被模拟的对象)和后续的持久层类(只要这些调用对于给定的接口(interface)是正确的), 除非我明确测试调用的方法顺序?

我是不是弄错了什么,我该怎么办?

最佳答案

您的方法 handle 不适合在单元测试中进行测试。 handle 所做的唯一事情就是与其他代码交互。但是,为了测试与其他代码的交互,您宁愿使用集成测试。

背景是,通过任何类型的测试,您的目标都是找到错误。通过单元测试,您可以尝试找出隔离代码中的错误。但是,如果您真的隔离了您的代码 - 会发现哪些错误?

您的代码中的错误更多的方向是“我是否以正确的顺序使用正确的参数调用其他对象的正确方法,并且返回值的形式是否符合我的预期。”所有这些问题都不会通过单元测试来回答,而是通过集成测试来回答。

关于python - 单元测试设计和模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58880214/

相关文章:

android - 第一次运行 Bottle + Python + Google App 引擎

python,匀称 : How to determine if two polygons cross each other,,同时允许它们的边缘重叠

java - 在断言之前测试被测试对象是否不为空的正确方法

.net - 在解决方案中测试项目

testing - 我本地项目的Aframe测试环境设置

php - 每次 PHPUnit 测试后换行

java - 发送请求到新创建的jetty服务器用于测试目的

python - 如何在 pygame 中为角色扮演游戏制作文本框/状态框?

python - "Not a valid string."- 尝试将 dict 保存到 Django Rest Framework 中的 TextField 时出错

nunit - Resharper 9.0 说 'No tests found in selected solution items.' 然而有超过 100 个测试