python中unittest框架应用

1、Unittest为Python内嵌的测试框架,不需要特殊配置

2、编写规范
需要导入 import unittest
测试类必须继承unittest.TestCase
测试方法以 test_开头
模块和类名没有要求

TestCase 理解为写测试用例
TestSuite 理解为测试用例的集合
TestLoader 理解为的测试用例加载
TestRunner 执行测试用例,并输出报告

import unittest
from class_api_login_topup.demo import http_request
from class_api_login_topup.http_attr import Get_Attr  # 反射的值 获取 cookies

# 这是文件http_attr中的Get_Attr类
class Get_Attr:
    cookies = None


class Login_Http(unittest.TestCase):

    def __init__(self, methodName, url, data, method, expected):
        super(Login_Http, self).__init__(methodName)  # 超继承
        self.url = url
        self.data = data
        self.expected = expected
        self.method = method

    def test_api(self):  # 正常登录
        res = http_request().request(self.url, self.data, self.method, getattr(Get_Attr, 'cookies'))
        if res.cookies:
            setattr(Get_Attr, 'cookies', res.cookies)
        try:
            self.assertEqual(self.expected, res.json()['code'])
        except AssertionError as e:
            print("test_api's, error is {0}", format(e))
            raise e
        print(res.json())


if __name__ == '__main__':
    unittest.main()

执行一:

import unittest
from class_demo_login_topup.http_tools import Login_Http

suite = unittest.TestSuite()
loader = unittest.TestLoader()

test_data = [{'url': 'http://test.lemonban.com/futureloan/mvc/api/member/login',
              'data': {'mobilephone': 'xxxx', 'pwd': '123456'}, 'expected': '10001', 'method': 'get'},
             {'url': 'http://test.lemonban.com/futureloan/mvc/api/member/login',
              'data': {'mobilephone': 'xxxx', 'pwd': '12345678'}, 'expected': '20111', 'method': 'get'},
             {'url': 'http://test.lemonban.com/futureloan/mvc/api/member/recharge',
              'data': {'mobilephone': 'xxxx', 'amount': '1000'}, 'expected': '10001', 'method': 'post'},
             {'url': 'http://test.lemonban.com/futureloan/mvc/api/member/recharge',
              'data': {'mobilephone': 'xxxx', 'amount': '-100'}, 'expected': '20117', 'method': 'post'}]
# 遍历数据,执行脚本 addTest 单个执行
for item in test_data:
    suite.addTest(Login_Http('test_api', item['url'], item['data'], item['method'], item['expected']))

#  执行
with open('http_TestCase.txt', 'w+', encoding='UTF-8') as file:
    runner = unittest.TextTestRunner(stream=file, verbosity=2)
    runner.run(suite)

# 运行结果
{'status': 1, 'code': '10001', 'data': None, 'msg': '登录成功'}
{'status': 0, 'code': '20111', 'data': None, 'msg': '用户名或密码错误'}
{'status': 1, 'code': '10001', 'data': {'id': 10011655, 'regname': '小蜜蜂', 'pwd': 'E10ADC3949BA59ABBE56E057F20F883E', 'mobilephone': 'xxxx', 'leaveamount': '150000.00', 'type': '1', 'regtime': '2021-07-14 14:54:08.0'}, 'msg': '充值成功'}
{'status': 0, 'code': '20117', 'data': None, 'msg': '请输入范围在0到50万之间的正数金额'}

执行二:把test_data的数据放在EXCEL中运行。

import unittest
from class_demo_login_topup.http_tools import Login_Http

suite = unittest.TestSuite()
loader = unittest.TestLoader()

test_data = HttpExcel('test_api.xlsx', 'python').real_excel()
for item in test_data:
    suite.addTest(Login_Http('test_api', item['url'], eval(item['data']), item['method'], str(item['expected'])))

with open('http_TestCase.txt', 'w+', encoding='UTF-8') as file:
    runner = unittest.TextTestRunner(stream=file, verbosity=2)
    runner.run(suite)   

执行三、直接用装饰器ddt

import unittest
from class_api_login_topup.demo import http_request
from class_api_login_topup.http_attr import Get_Attr  # 反射的值
from ddt import ddt, data, unpack
from class_demo_login_topup.http_excel import HttpExcel


test_data = HttpExcel('test_api.xlsx', 'python').real_excel()

@ddt
class Login_Http(unittest.TestCase):

    @data(*test_data)
    def test_api(self, item):  # 正常登录
        res = http_request().request(item['url'], eval(item['data']), item['method'], getattr(Get_Attr, 'cookies'))
        if res.cookies:
            setattr(Get_Attr, 'cookies', res.cookies)
        try:
            self.assertEqual(str(item['expected']), res.json()['code'])
        except AssertionError as e:
            print("test_api's, error is {0}", format(e))
            raise e
        print(res.json())

执行ddt方式一

import unittest
from class_demo_login_topup.http_tools import Login_Http
from class_demo_login_topup.http_excel import HttpExcel

suite = unittest.TestSuite()
loader = unittest.TestLoader()

from class_demo_login_topup import http_tools_1
suite.addTest(loader.loadTestsFromModule(http_tools_1))  # 执行整个文件

with open('http_TestCase.txt', 'w+', encoding='UTF-8') as file:
    runner = unittest.TextTestRunner(stream=file, verbosity=2)
    runner.run(suite)

执行ddt方式二

import unittest
from class_demo_login_topup.http_tools import Login_Http  # 不用ddt的方法
from class_demo_login_topup.http_excel import HttpExcel

suite = unittest.TestSuite()
loader = unittest.TestLoader()

from class_demo_login_topup.http_tools_1 import * # http_tools_1文件是用ddt的方法
suite.addTest(loader.loadTestsFromTestCase(Login_Http))  # 执行http_tools_1 文件下的Login_Http类,按照类执行

with open('http_TestCase.txt', 'w+', encoding='UTF-8') as file:
    runner = unittest.TextTestRunner(stream=file, verbosity=2)
    runner.run(suite)

unittest执行脚本的几种方法:

from test_case.case import TestProject
suite.addTest(TestProject('test_demo1'))  # 执行单独的测试用例,类下面的方法

from test_case import case
suite.addTest(loder.loadTestsFromModule(case))  # 执行整个文件

1、收集一条用例
suite.addTest(TestDemo('test_01'))  收集一条   
2、收集多条
case_list= [TestDemo("test_01"),TestDemo("test_03")]
suite.addTests(tests=case_list)
测试类为维度:
3、添加整个测试类
suite.addTest(unittest.makeSuite(TestDemo))
测试文件为维度:      
4、指定收集某个目录下的某个测试用例文件的测试用例 (以test开头的py文件)【常用的】 
test = os.path.dirname(__file__)  # unitest文件路径                  
suite = unittest.defaultTestLoader.discover(start_dir=test)        
或者 
test_dir = os.path.dirname(__file__)  # unitest文件路径
suite = unittest.defaultTestLoader.discover(test_dir,'test*.py')   


from test_case.case import *
suite.addTest(loder.loadTestsFromTestCase(TestProject))  # 执行文件下的类

from common.BeautifulReport import BeautifulReport as bf  # 执行路径下所有test文件中的test类的test方法
import time

discover=unittest.defaultTestLoader.discover(路径下, 'test*.py')  
report_path = './report/' + str(time.strftime('%Y%m%d%H%M%S'))
runner = bf(discover)
runner.report(filename=report_path, description="这是第一个自动化测试Demo")

执行最新:

import os
import unittest
import time


suite = unittest.TestCase()
loader = unittest.TestLoader()


start_dir = os.path.dirname(__file__)
suiteDone = unittest.defaultTestLoader.discover(start_dir, pattern='test*.py')
report_path = '../report/' + str(time.strftime('%Y%m%d-%H%M%S'))
with open(report_path, 'w+', encoding='UTF-8') as file:
    runner = unittest.TextTestRunner(stream=file, verbosity=2)
    runner.run(suiteDone)
    

3.测试报告 BeautifulReport
首先去安装:pip install BeautifulReport
按照好之后,利用 unittest 框架执行用例,并生成报告:


from common.BeautifulReport import BeautifulReport as bf
# 测试用例目录,定位到上层文件夹即可
test_dir = r'./web_ui_auto_lib/'
# 加载测试用例
discover = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py')
# 测试报告路径
filepathname = ConfigReader().get_value("file", "report_html_path")+datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S")
runner = bf(discover)
runner.report(report_dir=filepathname, description="自动化测试html页面报告")

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值