自动化测试之UnitTest 框架

一、要素

TestCase:测试用例
TestSuite:测试套件(多条测试用例集合在一起)
TestRunner:执行测试用例和测试套件
TestLoader:用来加载 TestCase 到 TestSuite 中,即加载满足条件的测试用例,并把测试用例封装成测试套件。
Fixture:对一个测试用例环境的初始化和销毁就是一个Fixture

二、使用过程

定义测试用例:

1、导包:import unittest;

2、定义测试类:新建测试类必须继承 unittest.TestCase;

3、定义测试方法:测试方法名称命名必须以 test 开头;

4、调用 unittest.main() 执行测试用例 ;

集合测试用例:

1、实例化: suite = unittest.TestSuite()

      (suite:为 TestSuite 实例化的名称)

2、添加用例:

  方法1:suite.addTest(ClassName("MethodName"))

      (ClassName:为类名;MethodName:为方法名)

  方法2:suite.addTest(unittest.makeSuite(ClassName))

      (搜索指定 ClassName 内 test 开头的方法并添加到测试套件中) 。

执行测试用例和测试套件:

1、实例化: runner = unittest.TextTestRunner()

2、执行: runner.run(suite) # suite:为测试套件名称

 

a.py

# 导包
import unittest
# 定义测试类

class my_test01(unittest.TestCase):
    # 定义测试方法
    def test_01(self):
        print("my_test01 的 test01")

    def test_02(self):
        print("my_test01 的 test02")

b.py

# 导包
import unittest
# 定义测试类

class my_test02(unittest.TestCase):
    def test_01(self):
        print("my_test02 的 test01")

    def test_02(self):
        print("my_test02 的 test02")

c.py

import unittest
import a
import b

# TestSuite实例化
suite = unittest.TestSuite()
# 添加用例
# suite.addTest(ClassName("MethodName"))
# 添加 my_test01 类中的test02方法
suite.addTest(a.my_test01("test_02"))
# suite.addTest(unittest.makeSuite(ClassName))
# 添加 my_test02 类中所有 test 开头的方法
suite.addTest(unittest.makeSuite(b.my_test02))
# TextTestRunner实例化
runner = unittest.TextTestRunner()
# 执行
runner.run(suite)

 

TestLoader:

用法:suite = unittest.TestLoader().discover(test_dir, pattern='test*.py')

      test_dir: 为指定的测试用例的目录;

      pattern:为查找的.py 文件的格式;

TestSuite与TestLoader区别:

1、TestSuite 需要手动添加测试用例(可以添加测试类,也可以添加测试类中某个测试方法);
2、TestLoader 搜索指定目录下指定开头.py 文件,并添加测试类中的所有的测试方法,不能指定添加测试方法;

 

三、Fixture

Fixture 是一个概述,对一个测试用例环境的初始化和销毁就是一个 Fixture 。

1、方法级别

初始化(前置处理): def setUp(self) --> 首先自动执行;

销毁(后置处理): def tearDown(self) --> 最后自动执行;

运行于测试方法的始末,即运行一次测试方法就会运行一次 setUp 和 tearDown

 

2、类级别

初始化(前置处理): @classmethod def setUpClass(cls): --> 首先自动执行

销毁(后置处理): @classmethod def tearDownClass(cls): --> 最后自动执行

运行于测试类的始末,即每个测试类只会运行一次 setUpClass 和tearDownClass

 

3、模块级别

初始化(前置处理): def setUpModule() --> 首先自动执行

销毁(后置处理): def tearDownModule() --> 最后自动执行

运行于整个模块的始末,即整个模块只会运行一次 setUpModule 和tearDownModule 


 

四、断言


 

五、参数化

导包:from parameterized import parameterized;

使用@parameterized.expand 装饰器可以为测试函数的参数进行参数化;

方法一:

import unittest
from parameterized import parameterized

def my_sum(a, b):
    return a + b

class my_test(unittest.TestCase):
    @parameterized.expand([(1, 2 ,3), (2, 3, 5), (2, 4, 6)])
    def test_01(self, x, y, z):
        r = my_sum(x, y)
        self.assertEqual(r, z)

方法二:

import unittest
from parameterized import parameterized

def my_sum(a, b):
    return a + b

# 构建测试数据
data = [(1, 1, 2), (1, 0, 1), (0, 0, 0)]

class my_test(unittest.TestCase):
    @parameterized.expand(data)
    def test_01(self, x, y, z):
        r = my_sum(x, y)
        self.assertEqual(r, z)

方法三:

import unittest
from parameterized import parameterized

def my_sum(a, b):
    return a + b

# 构建测试数据
def build_data():
    return [(1, 2 ,3), (2, 3, 5), (2, 4, 6)]

class my_test(unittest.TestCase):
    @parameterized.expand(build_data)
    def test_01(self, x, y, z):
        r = my_sum(x, y)
        self.assertEqual(r, z)

 

六、跳过

 

# 无条件地跳过装饰的测试,需要说明跳过测试的原因
unittest.skip(reason)
# 如果条件为真,则跳过装饰的测试
unittest.skipIf(condition, reason)
# 当条件为真时,执行装饰的测试。
unittest.skipUnless(condition, reason)
# 不管执行结果是否失败,都将测试标记为失败
unittest.expectedFailure()

 

 

 


 

七、生成HTML测试报告

1、TextTestRunner

1、导入unittest包;

2、生成测试套件 suite = unittest.TestLoader().discover("./", "test*.py") ;

3 、以只写方式打开测试报告文件f = open("test01.txt", "w",encoding="utf-8");

4、实例化 HTMLTestRunner 对象:runner = unittest.TextTestRunner(stream=f,verbosity=2)

参数说明:

stream 为 open 函数打开的文件流

verbosity 为不同模板编号

5、执行:runner.run(suite);

6、关闭文件;

import unittest 
suite = unittest.TestLoader().discover("./", "test*.py") 
f = open("test01.txt", "w", encoding="utf-8") 
runner = unittest.TextTestRunner(stream=f, verbosity=2) 
runner.run(suite) 
f.close() 

2、HTMLTestRunner

1、复制 HTMLTestRunner.py 文件到项目文件夹;

2、导入 HTMLTestRunner、unittest 包;

3、生成测试套件 suite = unittest.TestLoader().discover("./", "test*.py") ;

4、以只写方式打开测试报告文件 f = open("test01.html", "wb") ;

5、实例化 HTMLTestRunner 对象: runner = HTMLTestRunner(stream=f, title="自动化测试报告", description="Chrome 浏览器")

参数说明:

stream:open 函数打开的文件流

title:[可选参数],为报告标题

description:[可选参数],为报告描述信息;比如操作系统、浏览器等版本

6、执行:runner.run(suite);

7、关闭文件;

import unittest 
from HTMLTestRunner import HTMLTestRunner 
suite = unittest.TestLoader().discover("./", "test*.py") 
f = open("test01.html", "wb") 
runner = HTMLTestRunner(stream=f, title="自动化测试报告", description="Chrome 浏览器") 
runner.run(suite) 
f.close()

 

 

posted @ 2022-06-19 09:01  MToy  阅读(170)  评论(0)    收藏  举报