UI自动化测试(二)之unittest框架

1、unittest 是 Python 自带的一个单元测试框架,可以用于编写和运行单元测试。

unittest的作用是对软件中的最小可测试单元进行检查和验证,以确保每个单元的代码都能按照预期的功能和要求运行

2、在 unittest 框架中,最核心的四个概念分别是 TestCase、TestSuite、TestLoader 和 TestRunner。

  1. TestCase:TestCase 是 unittest 框架中的测试用例类,包含了多个测试方法和测试固件(setUp() 和 tearDown() 方法)。TestCase 子类需要继承 unittest.TestCase 并实现具体的测试方法和固件。单独一个测试方法称为一个 TestCase。
  2. TestSuite:TestSuite 是测试套件,可以将多个 TestCase 集合起来,作为一个整体进行运行和管理。TestSuite 支持添加和删除 TestCase,也支持嵌套其他 TestSuite。
  3. TestLoader:TestLoader 可以自动发现并加载指定路径下的所有 TestCase 或 TestSuite,生成一个 TestSuite 实例。TestLoader 还支持选择性地加载指定 TestCase 类或指定模块。
  4. TestRunner:TestRunner 是执行测试用例的组件,负责运行 TestSuite 中的所有 TestCase,并输出测试结果。unittest 内置了多种 TestRunner,例如 TextTestRunner、HTMLTestRunner 等。

请添加图片描述

3、TestCase

TestCase 是 unittest 框架中的一个核心概念,表示一个测试用例类。每个 TestCase 类包含多个测试方法(以 “test_” 开头的方法名)和测试固件(setUp() 和 tearDown() 方法),用于对被测程序进行单元测试。

创建一个 TestCase 子类非常简单,只需要继承 unittest.TestCase 并实现具体的测试方法即可。例如:

import unittest

class MyTestCase(unittest.TestCase):
    def test_add(self):
        self.assertEqual(1 + 2, 3)
	def test_subtract(self):
        self.assertEqual(5 - 2, 3)

断言

除了测试方法外,TestCase 还支持测试固件。setUp() 方法在每个测试方法执行前执行,用于初始化测试环境;tearDown() 方法在每个测试方法执行后执行,用于清理测试环境。例如:

class MyTestCase(unittest.TestCase):
    def setUp(self):
        self.my_list = []

    def tearDown(self):
        del self.my_list

    def test_append(self):
        self.my_list.append(1)
        self.assertEqual(self.my_list, [1])

    def test_pop(self):
        self.my_list.append(1)
        self.my_list.pop()
        self.assertEqual(self.my_list, [])

在上面的代码中,我们通过 setUp() 方法创建了一个空列表 self.my_list,用于在测试方法中进行操作。在 test_append() 方法中,我们向列表中添加元素,并使用断言方法 self.assertEqual() 判断结果是否正确;在 test_pop() 方法中,我们向列表中添加元素,再从列表中弹出元素,并使用断言方法判断结果是否正确。同时,我们通过 tearDown() 方法清理测试环境,删除列表对象 self.my_list。

TestFixure脚手架

TestFixure脚手架是一种测试技术,用于为测试用例提供一致的测试环境和数据1。TestFixure可以在不同的层级上使用,如用例级别、类级别和模块级别2

4、TestSuite

TestSuite(测试套件)是 unittest 框架中用于组织和运行测试用例的容器。一个 TestSuite 可以包含多个 TestCase 子类实例或其他 TestSuite 实例,用于组织和执行一组相关的测试用例。

创建一个 TestSuite 非常简单,只需要实例化 unittest.TestSuite 并使用 addTest() 方法添加要运行的 TestCase 或其他 TestSuite 实例即可,也可以使用 addTests() 方法以列表的形式添加多个。例如:

suite = unittest.TestSuite()
# 方式一
suite.addTest(CountTest('test_add'))
suite.addTest(CountTest('test_sub'))
# 方式二
suite.addTests([CountTest('test_add'),CountTest('test_sub')])

使用TestLoader添加测试用例

使用TestLoader添加测试用例是一种在unittest模块中组织和管理测试用例的方法1。TestLoader是一个类,可以从不同的来源加载测试用例,如类、模块、名称等,并返回一个TestSuite对象2

5、TestRunner

TestRunner 是 Python 中 unittest 模块中的一个类,用于运行测试用例并生成测试报告。主要使用HTMLTestRunner类调用run()方法生成HTML测试报告。

http://tungwaiyip.info/software/HTMLTestRunner.html

6、实例

主要实现获取哔哩哔哩入站必刷视频的标题、播放量和点赞数

逻辑操作部分

from time import sleep
from webdriver.getDriver import Driver
from selenium import webdriver

class Bili:
    def getTitle(self):
        # driver = Driver.getDriver()
        driver = webdriver.Chrome()
        driver.maximize_window()
        driver.implicitly_wait(10)
        driver.get("https://bilibili.com")

        driver.find_element_by_xpath("//div[@class='channel-icons']/a[2]").click()

        # 忘记了获取浏览器所有标签页的句柄
        handles = driver.window_handles
        driver.switch_to.window(handles[-1])

        # 使用了xpth和css来定位元素
        # driver.find_element_by_css_selector("img[src='//s1.hdslb.com/bfs/static/jinkela/popular/assets/icon_history.png']").click()
        driver.find_element_by_xpath("//div[@class='nav-tabs']/div[3]").click()
        sleep(2)

        titles = driver.find_elements_by_xpath("//div[@class='video-card']//p")

        for item in titles:
            print(item.text)

        return driver.title

测试用例部分

import unittest
from pages.test import Bili

class Tiltle(unittest.TestCase):
    def test_title(self):
        title = Bili().getTitle()
        self.assertEqual(title, "哔哩哔哩入站必刷")

生成测试报告部分

import unittest
from common.HTMLTestReportCN import HTMLTestRunner
import os
import time

report_path = "./report/"
report_title = "Bilibili测试"
report_descript = "本次测试是对bilibili测试"

if not os.path.exists(report_path):
    os.mkdir(report_path)

gettime = time.strftime("%Y%m%d%H%M%S")
# print(gettime)
filepath = report_path + f"report{gettime}.html"

suite = unittest.TestLoader().discover(start_dir="./test_case", pattern="test_*case.py")
with open(filepath, "wb") as f:
    runner = HTMLTestRunner(f,title=report_title,description=report_descript)
    runner.run(suite)

测试报告
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值