(1)单元自动化测试
(2)接口自动化测试
(3)UI自动化测试
(1)软件需求变动不频繁
(2)项目周期长
(3)自动化测试脚本可重复使用
Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作。
unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果。
单元测试框架:指的是在编程过程中,针对程序的最小单元(函数,方法)进行正确性的测试框架。
自动化测试框架:(1)提高测试效率,降低维护成本;(2)提高测试准确性,增加代码的重用性和可靠性;
单元测试框架是自动化测试框架的其中组成部分,主要用于管理和运行测试用例。
1.1.3 单元测试框架对比
python:unittest,pytest
java:junit,testing
import unittest #导入unittest模块
import HTMLTestRunner #导入HTMLTestRunner 报告模板模块
from BeautifulReport import BeautifulReport #导入BeautifulReport 报告模板模块
报告模板HTMLTestRunner模块
报告模板BeautifulReport
import unittest
class TestStringMethods(unittest.TestCase):
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
# check that s.split fails when the separator is not a string
with self.assertRaises(TypeError):
s.split(2)
if __name__ == '__main__':
unittest.main()
运行结果:
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
(1)import unittest #第一行是导入 unittest 这个模块;
(2)class TestStringMethods(unittest.TestCase) #class 这一行是定义一个测试的类,并继承 unittest.TestCase 这个类;
(3)test_upper、test_isupper、test_split为测试用例:测试用例的名称要以 test 开头;
(4).assert 为断言,断言其实就是拿实际结果和期望结果去对比;
如:
def testSubtract(self): # test method names begin with 'test'
result = 6-5 #实际结果
hope = 1 #期望结果
self.assertEqual(result, hope)
(5)unittest.main()是运行主函数,运行后会看到测试结果;
"""
1. 测试用例
2. 容器,容器添加测试用例
3. 运行容器中的测试用例
"""
import unittest
# 测试类,继承于unittest.TestCase
class MyTest(unittest.TestCase):
def test_1(self):
print('test_1')
def test_2(self):
print('test_2')
if __name__ == '__main__':
# 类的外面
# 2. 容器,容器添加测试用例
suite = unittest.TestSuite()
# 测试用例的执行顺序,按添加的顺序执行
suite.addTest(MyTest('test_1'))
suite.addTest(MyTest('test_2'))
# 3. 运行容器中的测试用例
runner = unittest.TextTestRunner()
runner.run(suite)
运行结果:
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
test_1
test_2
Process finished with exit code 0
1. 命令行的运行方式
python -m :以脚本(命令行)的方式来运行测试用例。
-v:以表详细的方式运行测试用例。
2、通过main运行
2、加载一个目录下所有的测试用例
(1)unittest.TestCase:TestCase类,所有测试用例类继承的基本类
(2)unittest.main():使用它可以方便的将一个单元测试模块变为可直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行它们。执行方法的默认顺序是:根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行。
(3)unittest.TestSuite():unittest框架的TestSuite()类是用来创建测试套件的。
(4)unittest.TextTextRunner():unittest框架的TextTextRunner()类,通过该类下面的run()方法来运行suite所组装的测试用例,入参为suite测试套件。
(5)unittest.defaultTestLoader(): defaultTestLoader()类,通过该类下面的discover()方法可自动更具测试目录start_dir匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件,因此可以直接通过run()方法执行discover。
discover=unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')
(6)unittest.skip():装饰器,当运行用例时,有些用例可能不想执行等,可用装饰器暂时屏蔽该条测试用例。
(1)setUp():setUp()方法用于测试用例执行前的初始化工作。如测试用例中需要访问数据库,可以在setUp中建立数据库连接并进行初始化。如测试用例需要登录web,可以先实例化浏览器。
(2)tearDown():tearDown()方法用于测试用例执行之后的善后工作。如关闭数据库连接。关闭浏览器。
(3)assert*():一些断言方法:在执行测试用例的过程中,最终用例是否执行通过,是通过判断测试得到的实际结果和预期结果是否相等决定的。
(1)addTest()
addTest(): addTest()方法是将测试用例添加到测试套件中,如下方,是将test_baidu模块下的BaiduTest类下的test_baidu测试用例添加到测试套件。
suite = unittest.TestSuite()
suite.addTest(test_baidu.BaiduTest('test_baidu'))
run(): run()方法是运行测试套件的测试用例,入参为suite测试套件。
runner = unittest.TextTestRunner()
runner.run(suite)
参考文献:
【1】单元测试unittest及报告生成(两种报告模板) - 我已不爱凯蒂 - 博客园
【2】 unittest --- 单元测试框架 — Python 3.10.4 文档
【3】python接口自动化(二十一)--unittest简介(详解) - 北京-宏哥 - 博客园
【4】unittest_核心概念(进阶) - Old_Arthurㄟ - 博客园
【5】Python 单元测试(unittest)_来玩魔王的咚!的技术博客_51CTO博客
【6】 Python XML 解析 | 菜鸟教程