pytest文档1--简介及用例规则 pytest简介 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)