这篇同样是“拿来”的。
pytest
will run all files in the current directory and its subdirectories of the form test_.py
or _test.py
. More generally, it follows standard test discovery rules.
python中的package和module
module
module
用于组织一系列相关的function
和class
,在文件系统中体现为一个.py
文件。
package
package
用于组织一些列相关的module
,在文件系统中体现为一个含有若干.py
文件的文件夹。 不过要让python
理解某个文件夹是package
,需要在该文件夹中添加一个名为__init__.py
的文件。__init__.py
文件可以为空(这个文件有其他功能,这里不讨论)
文件夹可以存放其他文件夹,同理,package也可以包含其他的package。
文件系统中的文件组织形式
因此,python
中的package
和module
,在文件系统中看应该是这样的
如何让python
找到自己编写的package
?
如果我们自己写了一个program.py
文件,希望它能够使用自己编写的package
或者module
,如何让python
能够找到自己编写的package
和module
呢?
例如,在program.py
中使用import
导入所需的函数
有以下几种方法
将package
文件夹和module
文件放在和program.py
同级的文件夹下
|
|
将package
文件夹和module
文件放在python
安装目录下的site-packages
文件夹下
我自己ubuntu
系统用anaconda
发行版,site-packages
的位置是/home/usr/anaconda3/lib/python3.5/site-packages
放在任意路径,将所在路径加入PYTHONPATH
环境变量(这个方法对于anaconda
似乎无效)
建议方法
这里建议的方式搭配Git
,让Git
统一管理package
的版本演变,而每个项目单独clone
一份所需的package
。这样既能够保证有一份统一的代码,也不会由于向后兼容问题导致以前项目的代码无法运行。
pytest
的基本用法
pytest
测试用例代码的组织方式
由于团队使用代码时可能随时会对已有的代码做出修改,修改后要运行测试用例确保没有引入新的问题。因此将测试用例代码和功能代码放在一起会比较方便。建议的方式是
注意test
文件夹下也需要添加 __init__.py
成为package
,否则test_module1.py
等测试代码使用如下的relative import
的时候就会报错
如果要运行测试用例代码,可以在packageName
所在的路径打开terminal
,运行
然后pytest
会自动遍历所有test_
开头的module
,然后执行其中test
开头的function
,以及Test
开头的class
中test
开头的method
并给出测试结果。
因此如果希望module
, function
, class
, class method
被pytest
自动识别的话, 记得用test
开头命名。(对于class
, 使用Test
)
测试用例的写法
例如写了下面一个功能函数func
,功能是返回一个字符串s
复制n
次后进行拼接的结果,如果s
不是字符串,那么抛出TypeError
的Exception
,并提示s should be string!
。那么测试用例可以这么写。
这里的关键是利用assert
语句
的功能是判断condition
是否成立, 如果成立,什么也不发生,否则的话会raise Exception
被pytest
识别。
condition
的内容一般是如果我们的函数正常生效,应该产生什么样的结果。
再上面的这个例子里,如果func(s, n)
生效,那么func('ab', 3)
应该等于'ababab'
为了检测s
不为字符的时候,func
是否正确的raise Exception
,可以这么写。
这里可以用pytest.raises
构造一个context-container
,然后构造一个场景,故意让被测函数触发raise Exception
的场景。
Exception
的信息会被error_info
捕捉, 然后检查str(error_info.value)
字符串中是否包含我们设想的Exception
内容即可。