测试框架(unittest)

一、unittest是什么?为什么使用unittest?unittest核心的四个概念?

        1. 是python自带的一个单元测试框架,也是python里面最基本的单元测试框架,存放在python安装目录下的lib目录下

        2. 在本次项目内,使用unittest框架来为我们组织测试用例

        3. unittest里面最核心的四个概念:

                test case===>测试用例

                test fixture===>测试夹具

                test runner===>测试执行

                test suite===>测试套件

二、unittest的书写规则?

        1. 测试文件必须以test开头,如:test_01_unittest入门脚本.py

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

        3.测试类也必须以Test开头,如:calss TestLogin(unittest.TestCase)

        4.测试方法最好以test开头,如:def test_01_login(self)

        5.在测试的py文件里面去执行代码,unittest.main()

        6.在测试的类里面可以有普通方法,但是普通方法需要被测试方法调用

#unittest入门脚本
import unittest
class TeatLogin(unittest.TestCase):
    def test_login(self):
        print("普通登录测试")

    def test_login_remember(self):
        print("记住密码测试")
if __name__ == '__main__':
    unittest.main()

三、unittest核心概念之 test fixture===>测试夹具

概念:
    test fixture==>测试夹具
语法
    方法级别:
        setup()     在每一个测试方法执行之前执行 setup 的代码
        teardown()  在每一个测试方法执行之后执行 teardown 的代码
    类级别:
        setupClass() 在每一个测试类执行之前执行的方法 需要使用@classmethod装饰
        teardownClass() 在每一个测试类执行之后执行的方法 需要使用@classmethod装饰
#测试夹具实现代码
import unittest
class TestLogin(unittest.TestCase):
    def test_login(self):
        """普通登录测试"""
        print("普通登录测试")

    def test_login_remember(self):
        """记住密码测试"""
        print("记住密码测试")

    def setUp(self) -> None:
        print("在每一个测试方法执行之前执行")

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

    @classmethod
    def setUpClass(cls) -> None:
        print("在每一个测试类执行之前执行的方法,需要使用@classmethod装饰")

    @classmethod
    def tearDownClass(cls) -> None:
        print("在每一个测试类执行之后执行的方法,需要使用@classmethod装饰")

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

 四、unittest用例执行顺序

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

import unittest
"""
在unittest里面,用例的执行顺序默认按照ASCll码的顺序,自定义测试用例的执行顺序,给每一条用例加上执行的序号test_01/02/03
"""
class TestLoginPay(unittest.TestCase):
    def test_01_login(self): 
        print("进入登录界面")

    def test_02_browse_products(self):
        print("浏览商品的界面")

    def test_03_add_to_cart(self):
        print("加入购物车的界面")

    def test_04_create_order(self):
        print("创建订单的界面")

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

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

 五、unittest断言方法

#unittest断言方法
# 概念
    断言:判断预期和实际结果是否相符合
# 语法
    self.assertEqual(a,b,msg='错误描述') ==> 判断  a==b成立则测试用例通过
    self.assertTrue(x,msg='错误描述') ==> 判断 表达式x 是否为true,为true通过测试
    self.assertIn(a,b,msg='错误描述') ==> 判断 a in b成立则测试通过
#unittest断言实现代码
import unittest
class TestLogin03(unittest.TestCase):
    def test_login(self):
        expected = 'admin'
        result = "admin"
        print("登录测试")
        self.assertEqual(expected,result, msg='用户名输入错误')  # 判断表达式a==b成立,则测试通过

    def test_add_to_cart(self):
        expected = 12
        result = 12
        print("加入购物车的界面")
        self.assertTrue(expected == result,msg='数量不对')  # 判断表达式a==b是否为True,为true通过测试

    def test_create_order(self):
        expected = '230527'
        result = 'tbd230527'
        print("创建订单的界面")
        self.assertIn(expected,result,msg="订单号错误")  # 判断表达式a是否在b里面
        # self.assertTrue(expected in result,msg='订单号错误')
if __name__ == '__main__':
    unittest.main()

六、跳过测试

跳过测试
    概念
        1.当我们写的部分用例,在某些情况下不需要执行的时候可以跳过
        2.当系统更新之后,部分的测试用例失效,但是不确定后面是否还会再改回来,就直接跳过
    语法
    装饰器实现的跳过测试用例
        @unittest.skip(原因) ==> 没有条件,直接跳过
        @unittest.skipIf(表达式,原因) ==> 表达式为真跳过测试
        @unittest.skipUnless(表达式,原因) ==> 表达式为假跳过测试
# 跳过测试代码实现
import unittest
import random
# 为0性别为男,为1性别为女
sex = random.randint(0,1)
class TestLoginPay(unittest.TestCase):
    def test_01_page_enter(self):
        print("进入商品界面")

    @unittest.skip(reason='不想浏览')  # 没有必要条件直接跳过
    def test_02_browse_products(self):
        print("浏览商品的界面")

    @unittest.skipIf(1==1,reason='不想加入购物车')  # 表达式为真跳过测试
    def test_03_add_to_cart(self):
        print("加入购物车的界面")

    def test_04_create_order(self):
        print("创建订单的界面")

    @unittest.skipUnless(sex==1, reason='不想支付订单')  # 表达式为假跳过测试,引用随机数
    def test_05_pay_order(self):
        print("支付订单的界面")
if __name__ == '__main__':
    unittest.main()

 七、test suite(测试套件)、test runne(测试执行)==>runCase

概念:
    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)

八、执行所有==>runAllcase

语法:
    test suite:
        unittest.defaultTestLoader.discover(start_dir=测试用例的目录,pattern=选取
测试用例执行的规则)
#执行所有case代码实现
import unittest
# 添加所有的测试用例套件
suite = unittest.defaultTestLoader.discover("./Case",pattern="test_03*.py")
# 实例化一个测试执行
runner = unittest.TextTestRunner()
# 执行测试
runner.run(suite)

九、 测试执行==>test runner

概念:
    HTMLTestRunner:第三方插件
    下载resource里面的HTMLTestRunnerPlugins放到python安装目录下的 lib 目录下
     1.生成的报告应该放在Report里面
     2.生成的报告应该以 .html结尾
#test runner报告生成实现代码
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')
# 打开我们刚才拼接好的路径
with open(report_name, 'wb') as fq:
    # 实例化一个 HTMLTestRunner
    runner = HTMLTestRunnerPlugins.HTMLTestRunner(
        stream=fq,
        verbosity=2,
        title='web自动化测试报告',
        description="执行完所有的测试用例",
        tester='第一组成员'
    )
    # 执行套件
    runner.run(suite)

        1.web测试报告 

 十、数据驱动

概念:
    数据驱动:有的用例只是参数不一样,其他代码完全一样,就可以通过改变测试参数来实现一条
用例方法执行多种不同的测试场景.在unittest里面需要使用 ddt 来提供参数化的功能
            pip install ddt  安装
语法:
    ddt可以参数化读取列表嵌套列表或者列表嵌套字典的数据
    列表嵌套列表读取:
        先在类前面加上: @ddt.ddt
        在方法前面加上: @ddt.data(*列表嵌套列表)
                      @ddt.unpack
    列表嵌套字典读取:
        先在类前面加上: @ddt.ddt
        在方法前面加上: @ddt.data(*列表嵌套列表)
                      在方法里面使用一个形式参数来接收
#数据驱动代码实现
import unittest
import ddt
from Common.OperationData import OperationData
from Page.Login_Page 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):
        print(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':
            print("判断表达式:",login.login_after_assert())
            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()

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值