python UnitTest

UnitTest是python 自带的自动化测试框架

 一、创建用例

 

 

 

 

 

二、添加用例到套件并执行用例

 

 

 

    suit = unittest.TestSuite()

suit.addTest(TestCase1.Test1.Test1("test_aaa"))    #一次添加一条用例
suit.addTest(TestCase1.Test1.Test1("test_something"))
#这里只是把用例添加到了套件中,并不是执行用例

#一次添加多条用例,通过列表的形式添加
suit.addTests([TestCase1.Test2.Test2("test_Add"), TestCase1.Test2.Test2("test_Dec") ])

r = unittest.TextTestRunner() #实例化套件
r.run(suit) #执行套件中用例

#一次性执行一个类中的测试用例  类装载器来实现
suite = unittest.TestSuite()
L = unittest.TestLoader() # 装载器实例化,注意加()
suite.addTests(L.loadTestsFromTestCase(TestCase1.Test1.Test1))
run = unittest.TextTestRunner()
run.run(suite)

用unittest.makeSuite一次导入一个类中的所有测试方法

 

 #用unittest.makeSuite一次导入一个类中的所有测试方法

#该方法不推荐使用,在python3.13中将被废弃(可以用类加载器)
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestCase1.Test1.Test1))
r = unittest.TextTestRunner()
r.run(suite)

 

#使用模块装载器  一次性执行一个py文件中的测试用例(一个文件可以有多个类)
suite = unittest.TestSuite()
L = unittest.TestLoader() # 装载器实例化,注意加()
suite.addTests(L.loadTestsFromModule(TestCase1.Test1)) # 从模块名载入
run = unittest.TextTestRunner()
run.run(suite)

 

#使用name装载器,类名/模块名 通用
suite = unittest.TestSuite()
L = unittest.TestLoader()
suite.addTests(unittest.TestLoader().loadTestsFromName('TestCase1.Test1')) # 装载TestCase1下的Test1模块名
suite.addTests(unittest.TestLoader().loadTestsFromName('TestCase1.Test2.Test2'))
#装载TestCase1下Test2模块下的Test2中类名

run = unittest.TextTestRunner()
run.run(suite)

 

 

 

 

 三、函数调用

Fixture:可以在测试用例执行之前自动调用指定的函数,在测试用例执行之后自动调用指定的函数

 

 

 

 

 

 

 

 

 

 

 

 四、断言

  • assertEqual(参数1,参数2)
    • 如果参数1,参数2的值相等,断言成功,否则断言失败
    • 两个参数,一个存放实际结果(参数1),一个存放预期结果(参数2)

 

 

  • assertIn(参数1,参数2)
    • 如果参数1在参数2里面,断言通过,否则断言失败
self.assertIn(5, [1, 3, 4, 5, 7])

五、参数化

Python 标准库中的unittest自身不支持参数化测试,为了解决这个问题,有人专门开发了两个库:一个是ddt,一个是parameterize

 

多个测试用例代码相同,只是测试数据不同,预期结果不同,可以把多个测试用例通过参数化技术合并为一个测试用例   

 

类装饰器@ddt表示类使用ddt

方法装饰器@data()传递参数,可以传递单个参数,参数数组,参数元组,参数字典等

方法装饰器@unpack用来拆分参数数据,可以拆分元组、列表、字典

方法装饰器@file_data("参数文件路径")用来导入外部参数文件,参数文件可以是josn文件和yaml文件,参数文件里的属性要和方法形参对应。

pip install ddt           

from  ddt  import  ddt,data, unpack ,file_data

 

 

 

 

 

 

 

 

 

 

                    

 需要安装  parameterized 包    pip install parameterized
from parameterized import parameterized

 

 通过Json文件导入参数

 

 

 

 

 def build_data():

    with open('data.json', encoding="utf-8") as f:
result = json.load(f)
data = []
for i in result:
data.append((i.get("name"), i.get("age"), i.get("type")))
return data


class MyTestCase(unittest.TestCase):

@parameterized.expand(build_data())
def test_aaa(self, name, age, type):
print(name, age, type)


@parameterized.expand([(1, 2), (3, 4), (5, 6)])
def test_something(self, a, b):
c = a + b
print(c)
# self.assertEqual(c, a+b)

五、跳过

可以通过@unittest.skip 跳过指定的方法或函数

 

 

六、TextTestRunner生成测试报告

 

 

 

 

 HTML测试报告:

HTMLTestRunner 是 Python 标准库的 unittest 模块的一个扩展,它可以生成 HTML的 测试报告

下载HTMLTestRunnerNew.py文件

下载链接:https://pan.baidu.com/s/1wqZIWN08h_cvvh0qorQI1g

将下载的文件保存到Python安装目录Lib下:

D:\Python35\Lib

在执行测试用例的时候引入,引入的方式: from HTMLTestRunnerNew import HTMLTestRunner

with open(os.getcwd()+'/testResult.html', 'wb+') as file:
run=HTMLTestRunnerNew.HTMLTestRunner(file, title='测试报告', description='单元测试', tester='may')
run.run(suite)

 

posted on 2023-04-07 15:46  yanmay  阅读(33)  评论(0编辑  收藏  举报

导航