测试框架(unittest)

unittest是Python的标准单元测试模块,用于编写和组织自动化测试用例。它包括testcase(测试用例)、testfixture(测试夹具)、testrunner(测试执行)和testsuite(测试套件)等核心概念。测试用例需遵循特定命名规则,并可使用setUp和tearDown方法进行预处理和后处理。此外,文章还介绍了如何使用HTMLTestRunner生成HTML测试报告。
摘要由CSDN通过智能技术生成

1.Untitest简介

unittest是Python自带的一个单元测试框架,也是Python里面最基础的单元测试框架,由于unittest是Python自带的标准模块,所以不需要单独再去安装。引入包import unittest即可使用

为什么使用Untites?

当我们写的自动化用例越来越多时,我们就需要考虑用例编写的规范与组织,以便于后期的维护,而unittest正是这样一款工具

2.unittest最核心的四个概念

1.test case:通常是使用assert方法检查动作和输入的响应,一般是基于TestCase类扩充。测试用例   用例创建/断言/跳过执行...

2.test fixture:一般用于准备及清理工作。测试夹具,管理用例执行之前的准备和执行之后的处理

3.test runner:测试执行。测试执行  生成测试报告

4.test suite:多个测试的集合。测试套件  收集需要执行的测试用例

3.unittest的书写规则

1.测试文件必须以test开头,如:test_login.Py

2.测试类必须继承unittest.TestCase类

3.测试类必须以Test开头

4.测试方法,必须以test开头,如: test_login

5.执行本文件中的测试用例,使用unittest.main()

6.在测试类中可以编写普通方法,但是必须被测试方法调用

import unittest

class TestLogin(unittest.TestCase):

    def test_login(self):
        print("")

    def test_login_remember(self):
        print("")


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

4.test fixture    测试夹具

方法级别:

setup():在每一个测试方法执行之前执行 setup 的代码

teardown():在每一个测试方法执行之后执行 teardown 的代码

类级别:

setupClass():在每一个测试类执行之前执行的方法 需要使用@classmethod装饰

teardownClass():在每一个测试类执行之后执行的方法 需要使用@classmethod装饰

import unittest


class Test_login2(unittest.TestCase):

    def test_login(self):
        print('普通的登录测试')

    def test_login_remember(self):
        print("记住密码登录")

    def setUp(self):
        print("setUp执行的代码,在每一个测试方法执行之前执行")

    def tearDown(self) -> None:
        print("teardown执行的代码,在每一个测试方法执行之后执行")

    @classmethod
    def setUpClass(cls) -> None:
        print("stupClass执行的代码,在整个测试类执行之前开始执行")

    @classmethod
    def tearDownClass(cls) -> None:
        print("teardownClass执行的代码,在整个测试类执行之后开始执行")


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

5.test用例执行顺序

self.assertEqual(a,b,msg='错误描述') 判断 a==b成立则测试用例通过

self.assertTrue(x,msg='错误描述') 判断 表达式x 是否为true,为true通过测试

self.assertIn(a,b,msg='错误描述') 判断 a in b成立则测试通过

在unittest里面,用例的执行顺序默认是按照 ASCII 码的顺序

自定义测试用例的执行顺序:给每一条用例加上执行的序号

import unittest


class TestLoginPay(unittest.TestCase):
    def test_01_login(self):
        print('先进行登录')

    def test_02_view_page(self):
        print("浏览网页,挑选合适的商品")

    def test_03_add_cart(self):
        print("选择合适的商品加入购物车")

    def test_04_create_order(self):
        print("生成订单")

    def test_05_pay_order(self):
        print("支付订单")


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

6.断言

断言:判断预期结果和实际结果是否相符合

self.assertEqual(a,b,msg='错误描述') 判断 a==b成立则测试用例通过

self.assertTrue(x,msg='错误描述') 判断 表达式x 是否为true,为true通过测试

self.assertIn(a,b,msg='错误描述') 判断 a in b成立则测试通过

import unittest


class TestLogin03(unittest.TestCase):

    def test_login(self):
        expected = 'admin'  # 预期结果
        result = "admin2"  # 实际结果
        print("登录测试")
        self.assertEqual(expected, result, msg='登录账号错误')

    def test_add_cart(self):
        expected = 10
        result = 9
        print("添加购物车")

        self.assertTrue(expected == result, msg='购物车数量不对')

    def test_pay_order(self):
        expected = "00122"
        result = 'order0012'
        print("支付订单")
        self.assertIn(expected, result, msg='订单号错误')


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

7.跳过测试

当我们写的部分用例,在某些情况下不需要执行的时候可以跳过

当系统更新之后,部分的测试用例失效,但是不确定后面是否还会再改回来,就直接跳过

装饰器实现的跳过测试用例:

@unittest.skip(原因) 没有条件,直接跳过

@unittest.skipIf(表达式,原因) 表达式为真跳过测试

@unittest.skipUnless(表达式,原因) 表达式为假跳过测试

import unittest
class Testlogin(unittest.TestCase):
    def test_01_login(self):
        print('登录账号')
    def test_02_view_page(self):
        print('游览网页,挑选合适的商品')
    @unittest.skipUnless(1==1,reason='没有合适的商品')
    def test_03_add_cart(self):
        print('选择合适的商品加入购物车')
    @unittest.skip('不想下单')
    def test_04_crerte_order(self):
        print('生成订单')
    @unittest.skipIf(1==0,reason='没钱支付订单')
    def test_05_zf_order(self):
        print('支付订单')
if __name__ == '__main__':
    unittest.main()

8.数据驱动

数据驱动:有的用例只是参数不一样,其他代码完全一样,就可以通过改变测试参数来实现一条用例方法 执行多种不同的测试场景.在unittest里面需要使用 ddt 来提供参数化的功能

安装ddt模块,打开cmd输入pip install ddt在线安装 ,输入pip install ddt 安装

ddt可以参数化读取列表嵌套列表或者列表嵌套字典的数据

列表嵌套列表读取:

先在类前面加上: @ddt.ddt

在方法前面加上: @ddt.data(*列表嵌套列表)

                            @ddt.unpack

列表嵌套字典读取:

先在类前面加上: @ddt.ddt

在方法前面加上: @ddt.data(*列表嵌套列表) 在方法里面使用一个形式参数来接收

import unittest  
import ddt    
test_data = [  
{"username":"abcd","password":"1234",”expect”:True},  
{"username":"asdf","password":"3456",”expect”:False},  
{"username":"qwer","password":"5432",”expect”:True }  
]   
@ddt.ddt  
class TestDemo2(unittest.TestCase):  
def setUp(self):  
print("测试开始")  
def tearDown(self):  
print("测试结束")  
@ddt.data(*test_data)  
def testCase01(self,data):  
'''测试用例01'''  
print(data["username"]+ data["password"]+ data["expect"])  
if __name__ == '__main__':  
    unittest.main() 

9.HTMLTestRunner报告

HTMLTestRunner是Python标准库的unittest单元测试框架的一个扩展。它生成易于使用的HTML测试报告。HTMLTestRunner是在BSD许可证下发布。

把resource下的HTMLTestRunnerPlugins.py放到python安装目录的lib下面

首先要下载HTMLTestRunner.py文件。

下载地址:HTMLTestRunner - tungwaiyip's software

import unittest, time  
import os  
import HTMLTestRunner  
# 或者将HTMLTestRunner文件拷贝到Python安装目录里的Lib文件夹下  
# 获取路径  
cur_path = os.path.dirname(os.path.realpath(__file__))  
# 测试用例路径  
case_path = os.path.join(cur_path, 'test_case1')  
# 测试报告路径  
report_path = os.path.join(cur_path, 'report')  
if __name__ == "__main__":  
# 构造测试集  
suite = unittest.defaultTestLoader.discover(case_path, 'test*.py')  
# 获取当前时间  
now = time.strftime('%Y-%m-%d %H_%M_%S')  
# 定义测试报告  
runner = HTMLTestRunner.HTMLTestRunner(title='自动化测试报告',
                                       description='用例执行情况:',
                          stream=open(report_path + '\\' + now + ' HTMLReport.html', 'wb'
                                        verbosity=2  )  
# 运行测试用例  
runner.run(suite)  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值