很早就知道TDD 的开发模式了,不过总是养不成先写测试的习惯,这次强制自己 把自己新项目中的测试部分加上,借此机会也学习了 pytest.
参考教程http://www.testclass.net/pytest/
这个网站上有很多 关于 test 的介绍也推荐给大家随时查阅。
下面介绍一下我使用的情况。
我使用的IDE 是VS Code, python3.6
按照 pytest
pip install pytest
测试的目录结构和src 目录同级 然后编写测试代码。
我的项目的代码结构如下
├── config #相关配置文件
├── logs #log文件夹
├── src
│ ├── algorithm #具体业务逻辑代码
│ │ ├── algorithm_result.py
│ │ ├── health_info.py
│ │ ├── load_info.py
│ │ └── parcel_info.py
│ ├── dao #关于数据库访问链接的代码
│ │ ├── database_connection.py
│ │ ├── database_dao.py
│ │ ├── database_service.py
│ │ ├── table_model.py
│ │ └── type.py
│ ├── logsetting # log 的配置
│ │ └── log_setting.py
│ ├── route.py # 主程序
│ ├── static # 前端代码
│ └── util
│ └── sendmail # 发邮件相关的代码
└── test # 测试代码
├── algorithm
│ ├── test_algorithm_result.py
│ ├── test_health_info.py
│ ├── test_load_info.py
│ └── test_parcel_info.py
└── test_route.py
目前就针对 algorithm方面写了pytest.
下面的代码是用来判断我代码中get_load_info() 这个函数是否正确返回的。
import sys
import datetime
import pytest
sys.path.append("../src")
import algorithm.health_info as hi
class TestHealthInfo(object):
def test_get_health_info(self):
dt = datetime.datetime.now().strftime("%Y-%m-%d")
res= hi.get_health_info(dt)
assert res['health']!= None
#为了测试多个用例,这里测试5次分别将3,4,6,7,8 这些参数代入进行测试
@pytest.mark.parametrize("campid", [3, 4, 6, 7, 8])
def test_get_algrithm_status_dic(self, campid):
dt = datetime.datetime.now().strftime("%Y-%m-%d")
res = hi.get_algrithm_status_dic(dt, campid)
print(res)
assert res['NORMAL'] != None
assert type(res) == dict
@pytest.mark.parametrize("campid", [3, 4, 6, 7, 8])
def test_get_confirm_status_dic(self, campid):
dt = datetime.datetime.now().strftime("%Y-%m-%d")
res = hi.get_confirm_status_dic(dt, campid)
print(res)
assert res['wave'] != None
这里@pytest.mark.parametrize("campid", [3, 4, 6, 7, 8]) 这一行给定了这个测试的参数,在运行的时候这个测试会执行5次,分别传入3,4,6,7,8 的参数进行测试,这个是我觉得比较方便的地方
用了断言判断相应的字段是否为空,判断返回值类型是否是 dict .
然后剩下的就是 在命令行里 输入pytest了。
还有另外一种方式就是这个VS code 里 会出现如下标志
点一下这个 Run Test 就能针对性的进行测试,或者按照Code Runner 这个拓展插件,选中 测试代码右击 run code 也可以。
这里由于有5个参数因此在这Run test后面有(Multiple)的标识, 当我们点击这个标识的时候,也可以去选择运行指定一个参数进行测试。还是比较人性化的。如下图。
这个pytest 还是比较方便的。学会这个技能之后就能使用TDD的开发模式啦