Python 接口自动化测试之 unittest


一、Python 之 unittest

基本概念

unittest 单元测试框架是受到 JUnit 的启发,与其他语言中的主流单元测试框架有着相似的风格。其支持测试自动化,配置共享和关机代码测试。支持将测试样例聚合到测试集中,并将测试与报告框架独立。 它分为四个部分 test fixture、?TestCase、test suite、test runner。分别是:

测试脚手架:为了开展项测试所需要进行的准备工作,以及所有相关的清理操作;

测试用例:一个测试用例是一个独立的测试单元。它检查输入特定的数据时的响应;

测试套件:它用于归档需要一起执行的测试用例;

测试运行器:是一个用于执行和输出测试结果的组件

TestCase 详解

类 TestCase 为测试用例提供了支持。通过继承 TestCase 来设置一个新的测试类,和设置测试方法,每个测试方法通过实际响应结果与预期结果对比来实现单元测试。

测试用例包括的方法:setUp()、tearDown()、setUpClass()、tearDownClass()

注意类名要以 Test 开头,测试用例的名称要以 test 开头。

下面一个示例来展示:

import unittest
class Test_unittest(unittest.TestCase):
def setUp(self) -> None:
print('setup')
def test(self):
print('test')
def tearDown(self) -> None:
print('teardown')


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

 可以看到运行结果打印了三条测试用例里的内容,setup 和teatdown 方法,在每次执行测试用例前后都会执行,如果在增加一条测试用例,setup 和teardown 也会再执行一次,如下图所示:

 所以如果想初始化和结束方法只想执行一次的话,可以使用setUpClass()、tearDownClass(),但是注意得在方法前面添加注解@classmethod,看下面示例和结果:

import unittest
class Test_unittest(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print('setup')
def testcase1(self):
print('testcase1')
def testcase2(self):
print('testcase2')
@classmethod
def tearDownClass(cls) -> None:
print('teardown')


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

常用方法

断言

测试用例中还有常用的断言和 skip 跳过测试用例。在 unittest 框架中也提供了一个自带的断言方式,主要有以下几种:

 SKIP 跳过

在实际测试中,如有功能缺陷的功能点对应的自动化测试用例执行不了,或者不执行的用例,可以用 skip()方法来操作。

使用方法为:

1.unittest.skip(‘输入理由’)——无条件执行跳过操作

2.unittest.skipif(2>1,’理由’)——判断条件为 true 的时候执行

3.unittest.skipUnless(1>2’理由’)—判断条件为 false 的时候执行

4.unittest.expectedFailure—执行错误不计入不通过用例中

下面查看示例,testcase1 方法被跳过,testcase2 方法使用了断言,但是断言结果不对,于是有报错信息。

import unittest
class Test_unittest(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print('setup')

@unittest.skip
def testcase1(self):
print('testcase1')

def testcase2(self):
a = 1
self.assertEqual(a, 2, msg='error')
print('testcase2')

def tearDown(self) -> None:
print('teardown')


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

 测试套件

测试套件:

当一个类里有多个测试用例又不会同时运行的时候,可以选择把测试用例添加到suite 中,中 suite 运行(pycharm 中直接在文件中写不行,要重新新建一个py 文件)

1.直接一个一个添加到 suite 中:

import unittest
from Dome2 import Test_unittest

taojian = unittest.TestSuite()
taojian.addTest(Test_unittest('testcase1'))
taojian.addTest(Test_unittest('testcase2'))
taojian.addTest(Test_unittest('testcase3'))

jieguo = unittest.TextTestRunner()
jieguo.run(taojian)

 解释:导入该文件中的类,定义一个套件名称,使用 testsuite 方法,对该套件添加测试用例,定义一个运行名称,使用运行方法,添加测试套件,即可运行。(得一个个的添加测试用例)

2.定义一个列表【】把用例都存进去,然后运行

import unittest
from Dome2 import Test_unittest

taojian = unittest.TestSuite()
case = [Test_unittest('testcase1'), Test_unittest('testcase2'), Test_unittest('testcase3')]
taojian.addTests(case)

jieguo = unittest.TextTestRunner()
jieguo.run(taojian)

 3.直接读取类名都形式来运行(最简单,最方便,不能使用‘’)

import unittest
from Dome2 import Test_unittest

taojian = unittest.TestSuite()
taojian.addTests(unittest.TestLoader().loadTestsFromTestCase(Test_unittest))
# taojian.addTests(unittest.TestLoader().loadTestsFromName('Dome2.Test_unittest'))
jieguo = unittest.TextTestRunner()
jieguo.run(taojian)

 4.也是读取名字,不过容易找不到类,需要在前面加一个文件名。

 TestRunner

1.编写完脚本之后重新新建一个文件然后添加用例到 suite,即可全部执行。

2.在网上下载 htmlTestrunner 源码,复制到 python/lib 目录即可import 导入。

import unittest
from Dome2 import Test_unittest
import htmlTestrunner

taojian = unittest.TestSuite()
taojian.addTests(unittest.TestLoader().loadTestsFromTestCase(Test_unittest))
# taojian.addTests(unittest.TestLoader().loadTestsFromName('Dome2.Test_unittest'))
# jieguo = unittest.TextTestRunner()
# jieguo.run(taojian)

with open("test_report.html", 'wb') as file:
jieguo = htmlTestrunner.HTMLTestRunner(stream=file, title='自动化测试报告,测试结果如下', description='用例执行情况')
jieguo.run(taojian)

相关