Flask 应用中的单元测试与功能测试?

3 投票
2 回答
2044 浏览
提问于 2025-04-18 06:38

我正在阅读以下手册:http://flask.pocoo.org/docs/testing/

Flask有一些功能,可以模拟请求并检查结果。整个应用程序都会被测试,包括数据库。

它与Python的一个模块unittest配合得很好。不过我觉得这更像是端到端测试或者功能测试,像Selenium这样的工具(也有Python的绑定)也会想到。

  1. 单元测试是否只是对特定模块、函数或类进行完全隔离的测试,并使用模拟来替代外部资源(比如数据库、网络、文件)?

  2. 使用单元测试框架来驱动功能测试或端到端测试可以吗?

2 个回答

3

Flask不会妨碍你使用Python或JavaScript的测试工具。举个例子,你可以进行各种类型的测试 (我故意不想给这些测试起名字,比如单元测试、功能测试、验收测试、集成测试等等,因为总会有人觉得这种分类不对)

  • 测试简单的或纯粹的函数或类
  • 在上面的基础上加上数据库(比如SQLAlchemy)(这通常比用模拟对象来测试ORM/数据对象更实用有效,虽然速度会慢一些)
  • 请求级别的测试(用来测试视图/路由) - 不是真正的HTTP请求,但差不多可以达到目的
  • 在浏览器中进行真实HTTP请求的测试,包括测试JavaScript模块

比如,使用pytest时,只需要处理conftest.py文件和一些准备工作,就可以提供appdb、HTTP服务器和Selenium驱动(在两个不同的线程中)等。甚至可以通过使用事务回滚来加快某些测试,而不是每次都重新创建数据库准备工作,这可以通过替换(monkeypatching)commit方法来实现。在测试期间,Flask可以提供一个特殊的静态文件夹(通过注册一个只在测试时使用的蓝图),以便使用特定于JavaScript的测试框架来测试JavaScript模块。

我想,其他通用的测试框架(我不称它们为单元测试!)也可以做到这一点,只是需要的样板代码和准备工作组织可能多或少不同。

1

Flask的测试工具在处理HTTP通信时会非常有用。

但是,一旦你创建的应用程序中,浏览器的作用变得很重要,比如它负责显示部分内容,并影响到可以做什么和不能做什么,那你就应该考虑使用像Selenium这样的解决方案。

撰写回答