关于Python 模块发现之旅

开发 后端
进行对Python 模块测试时的一个关键特性是,它们都可以搜索项目的源代码树,寻找项目的所有测试,所以不需要集中的测试列表。

本文进行着重讲述有关Python 模块的问题和技巧,在讲解Python 模快之前首先先让大家了解下什么是Python语言,所谓Python:是一种面向对象、直译式计算机程序设计语言,也是一种功能强大而完善的通用型语言。

但是,它们采用的测试发现规则不太一样,在选择框架时需要考虑到这一点。测试框架执行的第一步是,选择将在哪些目录中搜索包含测试的文件。注意,这三种框架都从整个项目的基目录开始搜索;如果要测试名为 example 的包,那么它们会从包含 example 的父目录开始搜索测试。

但是,这三种框架在选择搜索哪些目录方面有所差异:zope.testing 工具向下递归地搜索是 Python 包的所有目录,也就是包含 __init__.py 文件的目录(对于Python 模块,这说明可以用 import 语句导入它们)。

这意味着不检查非包目录中的数据和代码,但是另一方面,这也意味着从理论上说程序员可以用 import 语句导入您编写的每个测试。一些程序员觉得这让人不舒服,希望能够把测试放在包的一般用户看不到的地方。

py.test 命令向下递归地搜索项目的每个目录和子目录,无论目录是否是 Python 包。注意,当两个相邻目录包含同名的测试时,它似乎有一个 bug。例如,如果相邻的dir1/test.py 和 dir2/test.py 文件都包含名为 test_example 的测试,那么 py.test 将运行第一个测试两次。

而完全忽略第二个测试!如果为 py.test 编写测试并把它们放在非包目录中,就要注意保持名称是惟一的。nose 测试运行器采用的实现方式介于另两种工具之间:它向下递归地搜索每个 Python 包,但是只检查目录名中包含单词 test 的目录。

这意味着,如果不想让 nose 搜索某个目录,那么只需注意不在目录名中包含 test 即可。与 py.test 不同,nose 可以正确地处理包含同名测试的相邻目录(但是保持测试名称惟一仍然是有帮助的,这样在用 -v 选项显示测试结果时不容易混淆)。

选择了要搜索的目录之后,这三种测试工具的做法就非常相似了:它们都寻找与某一模式匹配的 Python 模块(也就是以 .py 结尾的文件)。zope.testing 工具在默认情况下使用正则表达式 "tests",也就是只寻找名为 tests.py 的文件,忽略其他所有文件。可以使用命令行选项或 buildout.cfg 指定另一个正则表达式

  1. # Snippet of a buildout.cfg file that searches for tests  
  2. # in any Python module starting with "test" or "ftest".  
  3.  
  4. [test]  
  5. recipe = zc.recipe.testrunner  
  6. eggs = my_package 
  7. defaults = ['--tests-pattern', 'f?test'] 

py.test 更死板,总是寻找名称以 `test_ 开头或以 _test 结尾的 Python 模块。nosetests 命令更灵活,它使用一个正则表达式(“((?:^|[\b_\.-])[Tt]est)”)选择以 test 或 Test 开头或这个单词处于单词边界后面的模块。通过在命令行上使用 -m 选项或在项目的 .noserc 文件中设置这个选项,可以指定另一个正则表达式。

哪种方法最好?尽管一些开发人员喜欢有灵活性,而且许多人认为 zope.testing 工具的搜索范围应该更宽,不应该只限于文件名为 tests.py 的模块,但是我实际上更喜欢 py.test 采用的方式。

所有使用 py.test 的项目必须在测试命名方面采用一致的约定,这让其他程序员更容易阅读和维护测试。在使用另外两种框架时。阅读或创建测试文件需要两步:首先,必须了解这个项目使用的正则表达式,然后才能检查它的代码。如果您同时从事多个项目,就必须记住几种不同的测试文件命名约定。

责任编辑:chenqingxiang 来源: 网界网
相关推荐

2009-02-24 09:04:53

数据库工程师 评选

2010-04-23 15:39:00

无线网路路由器华硕

2010-05-11 22:32:48

无线产品无线路由华硕

2015-07-07 11:12:48

2019-10-24 15:28:41

Python程序员数据

2009-03-24 14:47:55

无线家居无线产品华硕

2018-09-28 10:45:19

Python 开发模块

2010-03-25 11:39:36

华硕

2011-08-29 10:22:48

QtWebkit 模块HTML文档

2015-06-29 10:40:23

运维管理/北塔

2011-08-15 15:56:29

Cocoa编程模块

2011-08-29 15:53:04

Lua位运算

2022-09-15 15:04:47

物联网通信数据

2015-09-15 16:10:45

PythonPython 开发Docker

2011-05-23 16:50:12

python

2022-04-06 08:47:03

Dubbo服务协议

2018-11-05 20:00:00

正则表达式爬虫Python

2020-05-18 08:42:23

CSS背景图像前端开发

2015-07-14 09:45:09

虚拟化

2022-08-10 18:23:39

Python软件包索引恶意软件
点赞
收藏

51CTO技术栈公众号