Unittest框架的使用方法

本文详细介绍了Python内置的UnitTest框架的使用方法,包括测试用例的编写、断言方法、测试用例执行顺序、测试用例跳过机制、测试套件与测试报告的生成,以及数据驱动测试的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、UnitTest框架的使用

  • python自带的一个单元测试的测试框架
  • 可以结合selenium、request实现UI和接口的自动化测试
  • 无需额外安装,python中已经加载了UnitTest框架
import unittest
  • UnitTest框架中,有以下几个组件:
  1. test fixture :setUp(前置条件),tearDown(后置条件),用于初始化测试用例、清理释放资源
  2. test case :测试用例,以继承unittest.TestCase实现用例的继承,在UnitTest中,测试用例都通过test识别,所以在每个用例的命名上,必须要带上test,否则就不会识别
  3. test suite :测试套件,即测试用例集,list = (case1,case2…)
  4. test runner :运行器,通过runner调用suite执行测试
  5. test report:生成测试报告

其对应关系为:

 

  •  UnitTest的运行机制:通过定义unittest.main()方法即可
import unittest

class Demo01(unittest.TestCase):

    #类的初始化
    @classmethod
    def setUpClass(cls) -> None:
        print('class')

    #类的资源释放
    @classmethod
    def tearDownClass(cls) -> None:
        print('tclass')

    #初始化
    def setUp(self) -> None:
        print('setUp')

    #释放资源
    def tearDown(self) -> None:
        print('tearDown')

    #测试用例
    def test_a(self):
        print('a')
    def test_b(self):
        print('b')

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

二、UnitTest断言

  • Unittest中,Testcast有封装好的断言方法进行断言,用于判断case通过或失败
  • 如果断言通过, 测试会继续执行到下一行的代码
  • 如果断言失败, 对应的case测试会立即停止或者生成错误信息,但是不要影响其他的case执行
以下是常见的一些断言方法:
 
序号断言方法断言描述
1assertEqual(arg1, arg2, msg=None)验证arg1=arg2,不等则fail
2assertNotEqual(arg1, arg2, msg=None)验证arg1 != arg2, 相等则fail
3assertTrue(expr, msg=None)验证exprtrue,如果为false,则fail
4assertFalse(expr,msg=None)验证exprfalse,如果为true,则fail
5assertIs(arg1, arg2, msg=None)验证arg1arg2是同一个对象,不是则fail
6assertIsNot(arg1, arg2, msg=None)验证arg1arg2不是同一个对象,是则fail
7assertIsNone(expr, msg=None)验证expr是None,不是则fail
8assertIsNotNone(expr, msg=None)验证expr不是None,是则fail

下面举例说明断言语句如何编写:

self.assertEqual("admin", driver.find_element_by_link_text("admin").text)

三、测试用例执行顺序

  • unittest 框架默认加载测试用例的顺序是根据ASCII 码的顺序,数字与字母的顺序为: 0~9,A~Z,a~z
  • 以下面的代码来看,执行顺序即为:test_1 ==> test_2 ==> test_3
# coding:utf8
import unittest
from selenium import webdriver
import time

class forTest(unittest.TestCase):
    def setUp(self) -> None:
        self.driver = webdriver.Firefox()
        self.driver.get("http://www.baidu.com")
        
    def tearDown(self) -> None:
        time.sleep(5)
        self.driver.quit()
    
    def test_1(self):
        self.driver.find_element_by_id("kw").send_keys("大虞海棠")
        self.driver.find_element_by_id("su").click()

    def test_2(self):
        self.driver.find_element_by_id("kw").send_keys("欣风雪雨")
        self.driver.find_element_by_id("su").click()

    def test_3(self):
        self.driver.find_element_by_id("kw").send_keys("宅欣棠雪")
        self.driver.find_element_by_id("su").click()

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

四、UnitTest.skip用法

  • 在case中,如果需要忽略某些用例或者特定条件下不执行的用例,那么就可以使用skip
  • skip 是通过装饰器执行,无条件执行跳过操作,有一个参数,传入的内容会在控制台显示
  • 如果使用 skipIf 将会有条件的执行跳过操作
# coding:utf8
import unittest
from selenium import webdriver

class Demo03(unittest.TestCase):
    #初始化
    def setUp(self):
        print('setUp')

    #释放资源
    def tearDown(self):
        print('tearDown')

    #测试用例
    #无条件执行跳过操作
    @unittest.skip('不需要运行该条用例')
    def test_a(self):
        print('1')

    def test_b(self):
        print('2')

    # 有条件执行跳过操作
    @unittest.skipIf(1 < 2, '如果if条件是true就跳过')
    def test_c(self):
        print('3')

    def test_d(self):
        print('4')

    @unittest.skipUnless(1 > 2, '如果unless条件是false就跳过')
    def test_e(self):
        print('5')

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

五、测试套件suite与Runner

  • 方式一可以约定测试用例的执行顺序,让测试用例不必根据默认执行顺序执行
  • 方式二是将测试用例组装成一个list
  • 方式三是通过路径来访问每个类中的测试用例
  • 方式四是根据具体的类执行某个类中所有的测试用例
# coding:utf8
import unittest
from demo.Demo03 import *

#创建一个测试套件
suite = unittest.TestSuite()

#给套件中添加测试用例

#方式一
suite.addTest(Demo03('test_2'))
suite.addTest(Demo03('test_1'))
suite.addTest(Demo03('test_3'))

#方式二
#case = [Demo03('test_2'), Demo03('test_1'), Demo03('test_3')]
#suite.addTests(case)

#方式三
#test_dir = './'
#discover = unittest.defaultTestLoader.discover(start_dir=test_dir, pattern='Demo*.py')

#方式四
#suite.addTests(unittest.TestLoader().loadTestsFromTestCase(Demo03))

#通过TextTestRunner对象运行unittest.main()
runner = unittest.TextTestRunner()
runner.run(suite)

六、TestRoport测试报告

  • 首先下载HTMLTestRunner.py 文件,下载地址: http://tungwaiyip.info/software/HTMLTestRunner.html
  • 因为HTMLTestRunner原先是适用于python2,所以需要对文件进行一些修改,然后导入到site-packages/lib文件夹中
# coding:utf-8
import unittest, os
from demo.Demo03 import *
from HTMLTestRunner import HTMLTestRunner

#创建一个测试套件
suite = unittest.TestSuite()

report_name = '测试报告名称'
report_title = '测试报告标题'
report_desc = '测试报告描述'
report_path = './report/'
report_file = report_path+'report.html'
if not os.path.exists(report_path):
    os.mkdir(report_path)
else:
    pass
with open(report_file, 'wb') as report:
    suite.addTests(unittest.TestLoader().loadTestsFromTestCase(Demo03))
    runner = HTMLTestRunner(steam=report, title=report_title, desc=report_desc)
    runner.run(suite)
report.close()

七、DDT数据驱动

. 可以看出上面的每一个测试用例都是有重复的地方,所以采用DDT来简化代码,DDT包含类的装饰器ddt和两个方法装饰器data

  • data::包含的参数与要输入测试的值一样多。
  • file_data:将从JSON或YAML文件加载测试数据。

注:只有以“.yml”和“.yaml”结尾的文件作为YAML文件加载。所有其他文件都以JSON文件的形式加载。且文件如果是列表,那么列表的值会作为测试用例参数,同时,会作为测试用例方法名后缀显示。

from ddt import ddt,data,file_data,unpack
import unittest

@ddt
class MyTestDdt(unittest.TestCase):
    def setUp(self):
        print('start')

    @data(2,4)#使用data传参数给测试用例
    def test_one(self,value):
        print(f'the @data number is :{value}')

    def tearDown(self):
        print('end')

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

 

### 如何使用 `unittest` 框架进行 Python 单元测试 #### 创建测试类和方法 为了利用 `unittest` 进行单元测试,通常会定义继承自 `unittest.TestCase` 的测试类,在此类中实现具体的测试逻辑。每一个以 `test_` 开头的方法代表一个独立的测试案例。 ```python import unittest class MyTestCase(unittest.TestCase): def setUp(self): # 设置每条测试前要执行的操作 pass def tearDown(self): # 清理每条测试后的工作 pass def test_example(self): self.assertEqual('foo'.upper(), 'FOO') # 断言两个值相等 ``` #### 执行测试用例 可以通过多种方式来触发这些测试: - **脚本内部调用**:在文件底部加入如下代码片段可以方便地运行该文件内的所有测试。 ```python if __name__ == '__main__': unittest.main() ``` - **命令行工具**:借助 Python 解释器自带的功能直接从终端启动特定模块或者整个项目的测试集[^1]。 - 探索性测试,默认搜索当前目录及其子目录中,所有 `test*.py` 模式的测试文件: ```bash python -m unittest ``` - 对单个模块或多个指定模块执行测试: ```bash python -m unittest test_module1 test_module2 ``` - 针对某个类下的全部测试函数: ```bash python -m unittest test_module.TestClass ``` - 或者更精确到某一条具体测试项上: ```bash python -m unittest test_module.TestClass.test_method ``` #### 基础概念与特性支持 除了上述提到的基础操作外,`unittest` 还提供了丰富的特性和辅助功能,比如设置前置条件(`setUp`)、清理资源(`tearDown`)、跳过某些条件下不适用的测试(@skip装饰器),以及各种类型的断言语句等等[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值