pytest简介
pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高。根据pytest的官方网站介绍,它具有如下特点:
- 非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考
- 能够支持简单的单元测试和复杂的功能测试
- 支持参数化
- 执行测试过程中可以将某些测试跳过(skip),或者对某些预期失败的case标记成失败
- 支持重复执行(rerun)失败的case
- 支持运行由nose, unittest编写的测试case
- 可生成html报告
- 方便的和持续集成工具jenkins集成
- 可支持执行部分用例
- 具有很多第三方插件,并且可以自定义扩展
pytest用例规则
- 测试文件以test_开头(以_test结尾也可以)
- 测试类以Test开头,并且不能带有
__init__
方法 - 测试函数以test_开头
- 断言使用assert
示例代码
# -*- coding:utf-8 -*- import unittest import requests from time import sleep import HTMLTestRunner # 构造WeatherTest类,继承unittest.TestCase class WeatherTest(unittest.TestCase): # 用例执行前的准备工作 def setUp(self): self.url = 'http://t.weather.sojson.com/api/weather/city' # 定义测试guangzhou天气的方法 def test_weather_handan(self): # 用例方法需要以test开头,便于执行顺利 ''' Case01-正常存在的city_code值 ''' data = {'city_code':'101091001'} r = requests.get(self.url+'/'+data['city_code']) # 拼接接口URL result = r.json() # 将返回结果转换为json类型 # 设置断言 self.assertEqual(result['status'],200) # 状态码 self.assertEqual(result['message'],'Success !') self.assertEqual(result['cityInfo']['city'],'邯郸市') self.assertEqual(result['cityInfo']['cityId'],'101091001') sleep(3) # 控制请求的间隔时间,防止过快请求而IP受限制 def test_weather_param_error(self): ''' Case02-错误的city_code值 ''' data = {'city_code':'666abc'} r = requests.get(self.url+'/'+data['city_code']) result = r.json() self.assertEqual(result['message'],'Request resource not found.') self.assertEqual(result['status'],404) sleep(3) def test_weather_param_non_existent(self): ''' Case03-不存在的city_code值 ''' data = {'city_code':'123456789'} r = requests.get(self.url+'/'+data['city_code']) result = r.json() self.assertEqual(result['message'],'no_city_id') self.assertEqual(result['status'],403) sleep(3) def test_weather_no_param(self): ''' Case04-不传入任何city_code值(空) ''' data = {'city_code':''} r = requests.get(self.url+'/'+data['city_code']) result = r.json() self.assertEqual(result['message'],'Request resource not found.') self.assertEqual(result['status'],404) sleep(3) # 调试WeatherTest类 if __name__ == '__main__': report_dir = r's.html' re_open=open(report_dir,'wb') suite=unittest.TestLoader().loadTestsFromTestCase(WeatherTest) runner=HTMLTestRunner.HTMLTestRunner( stream=re_open, title=u'天气接口测试报告', description=u'天气接口详情' ) runner.run(suite)