Unittest测试框架以及使用方法

目录

1.Untitest简介

2.Untitest基本概念

2.1 unittest里面最核心的四个概念:    test case        测试用例    test fixture    测试夹具    test runner        测试执行    test suite        测试套件

2.2 unittest的书写规则

2.3  test fixture 测试夹具

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

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

3.测试用例执行顺序

在unittest里面,用例的执行顺序默认是按照 ASCII 码的顺序 自定义测试用例的执行顺序:给每一条用例加上执行的序号

4.断言

self.assertEqual(a,b,msg='错误描述')        判断  a==b成立则测试用例通过self.assertTrue(x,msg='错误描述')           判断 表达式x 是否为true,为true通过测试self.assertIn(a,b,msg='错误描述')           判断 a in b成立则测试通过

5.跳过测试

跳过测试:    1.当我们写的部分用例,在某些情况下不需要执行的时候可以跳过    2.当系统更新之后,部分的测试用例失效,但是不确定后面是否还会再改回来,就直接跳过

装饰器实现的跳过测试用例:    @unittest.skip(原因)    没有条件,直接跳过    @unittest.skipIf(表达式,原因)    表达式为真跳过测试    @unittest.skipUnless(表达式,原因)    表达式为假跳过测试

6.测试套件

test suite 测试套件:把需要执行的测试用例放到一个套子test runner 测试执行:使用测试执行去执行所有在套子里面的测试用例

测试套件:适合作为调试测试用例    suite = unittest.TestSuite()    suite.addTest(测试类('测试方法'))

测试执行    runner = unittest.TextTestRunner()    runner.run(suite)

7.ddt 数据驱动

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

列表嵌套列表读取:

在类前面加上: @ddt.ddt

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

                           @ddt.unpack

列表嵌套字典读取:

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

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

                         在方法里面使用一个形式参数来接收

7.1 环境准备

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

>>pip install ddt

7.2代码如下

8.HTMLTestRunner报告

HTMLTestRunner:第三方插件

下载resource里面的HTMLTestRunnerPlugins放到python安装目录下的 lib 目录下

1.生成的报告应该放在Report里面

2.生成的报告应该以 .html结尾


1.Untitest简介

unittest是Python自带的一个单元测试框架,unittest又被称为PyUnit,是由Java的JUnit衍生而来,基本结构是类似的。对于单元测试,需要设置预先条件,对比预期结果和实际结果。

由于unittest是Python自带的标准模块,所以不需要单独再去安装。引入包import unittest即可使用。

2.Untitest基本概念

2.1 unittest里面最核心的四个概念:
    test case        测试用例
    test fixture    测试夹具
    test runner        测试执行
    test suite        测试套件

2.2 unittest的书写规则

1.测试文件必须以 test 开头  如:test_01_unittest入门脚本.py
2.测试类必须继承 unittest.TestCase 类
3.测试类必须以 Test 开头   如:class TestLogin(unittest.TestCase)
4.测试方法,最好以 test 开头    如:def test_01_login(self)
5.在测试的py文件里面去执行代码 unittest.main()
6.在测试类里面 可以有普通方法,但是普通的方法需要被测试方法调用

# unittest入门脚本
import unittest


class TestLogin(unittest.TestCase):

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

    def test_login_remember(self):
        """记住登录"""
        print("记住保存信息登录")


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

2.3  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()

3.测试用例执行顺序

在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()

4.断言

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='订单号错误')
        # self.assertTrue(expected in result,msg='订单号错误')


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

5.跳过测试

跳过测试:
    1.当我们写的部分用例,在某些情况下不需要执行的时候可以跳过
    2.当系统更新之后,部分的测试用例失效,但是不确定后面是否还会再改回来,就直接跳过

装饰器实现的跳过测试用例:
    @unittest.skip(原因)    没有条件,直接跳过
    @unittest.skipIf(表达式,原因)    表达式为真跳过测试
    @unittest.skipUnless(表达式,原因)    表达式为假跳过测试

import unittest
import random

# 性别 1 表示男性 0 表示女性
sex = random.randint(0,1)


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

    @unittest.skip("不想花钱")
    def test_02_view_page(self):
        print("浏览网页,挑选合适的商品")

    @unittest.skipUnless(1==2,'不加入购物车')
    def test_03_add_cart(self):
        print("选择合适的商品加入购物车")

    @unittest.skipIf(1==2,reason='不想下单')
    def test_04_create_order(self):
        print("生成订单")

    @unittest.skipIf(sex==1,reason='男的不想花钱,女的花钱买买买')
    def test_05_pay_order(self):
        print("支付订单")


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

6.测试套件

test suite 测试套件:把需要执行的测试用例放到一个套子
test runner 测试执行:使用测试执行去执行所有在套子里面的测试用例

测试套件:适合作为调试测试用例
    suite = unittest.TestSuite()
    suite.addTest(测试类('测试方法'))

测试执行
    runner = unittest.TextTestRunner()
    runner.run(suite)

​
import unittest
from Case.test_03 import TestLoginPay
from Case.test_04 import TestLogin03

# unittest.main()

# 添加不同的测试用例
# 实例化一个测试套件
suite = unittest.TestSuite()

suite.addTest(TestLoginPay('test_01_login'))
suite.addTest(TestLoginPay("test_04_create_order"))

suite.addTest(TestLogin03("test_login"))


# 实例化一个测试执行
runner = unittest.TextTestRunner()
runner.run(suite)

​

7.ddt 数据驱动

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

列表嵌套列表读取:

在类前面加上: @ddt.ddt

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

                           @ddt.unpack

列表嵌套字典读取:

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

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

                         在方法里面使用一个形式参数来接收

7.1 环境准备

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

>>pip install ddt

7.2代码如下

import unittest
import ddt
from Common.OperationData import OperationData
from Page.LoginPage import LoginPage

data_list = OperationData('user_data.xls').get_data_list()
data_dict = OperationData('user_data.xls').get_data_dict()


@ddt.ddt
class TestLoginDDt(unittest.TestCase):

    @ddt.data(*data_dict)
    def test_login_dict(self, dict_data):
        login = LoginPage("chrome")
        login.open_login_url()

        # 输入账号
        login.send_user_name(dict_data['username'])
        # 输入密码
        login.send_password(dict_data['password'])
        # 点击登录
        login.click_login()

        # 进行断言
        if str(dict_data["expected"]) == '1':
            self.assertTrue(login.login_after_assert(), msg="登录失败")
        elif str(dict_data["expected"]) == '0':
            self.assertTrue(not login.login_after_assert(), msg="登录失败")
        else:
            print("预期结果超过限制")


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

8.HTMLTestRunner报告

HTMLTestRunner:第三方插件

下载resource里面的HTMLTestRunnerPlugins放到python安装目录下的 lib 目录下

1.生成的报告应该放在Report里面

2.生成的报告应该以 .html结尾

import unittest
import HTMLTestRunnerPlugins
import os
import time

# 获取测试报告的路径进行拼接
report_path = os.path.dirname(__file__) + '/Report/'

# 获取当前时间
now = time.strftime('%Y-%m-%d %H_%M_%S')

# 根据路径和时间拼接最终的文件路径
report_name = report_path + now + 'HTMLReport.html'

# 添加执行的测试目录到套件里面
suite = unittest.defaultTestLoader.discover('./Case')

# unittest.TextTestRunner().run(suite)

# 打开我们刚才拼接好的路径
with open(report_name, 'wb') as fq:
    # 实例化一个 HTMLTestRunner
    runner = HTMLTestRunnerPlugins.HTMLTestRunner(
        stream=fq,
        verbosity=2,
        title='web自动化测试报告',
        description="本次执行完所有的测试用例",
        tester='执行人'
    )
    # 执行套件
    runner.run(suite)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值