用Python搭建自动化测试框架,需要组织用例以及测试执行,大部分推荐的是unittest。现在搭建python接口框架用的也是这个,随着了解,也有其他的框架,有时间再多去学习,保持持续学习哦~希望对大家有帮助
附上官方文档地址: https://docs.python.org/2.7/library/unittest.html#
unittest是Python自带的单元测试框,可以用来作自动化测试框架的用例组织执行框架。
优点:提供用例组织与执行方法;提供比较方法;提供丰富的日志、清晰的报告
流程:
写好TestCase
由TestLoader加载TestCase到TestSuite
然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中。
通过命令行或者unittest.main()执行时,main会调用TextTestRunner中的run()来执行,或者可以直接通过TextTestRunner来执行用例。
在Runner执行时,默认将执行结果输出到控制台,我们可以设置其输出到文件,在文件中查看结果
unittest中最核心的部分是:TestFixture、TestCase、TestSuite、TestRunner
1、Test fixture
测试用例每次执行之前需要准备测试环境,每次测试完成后还原测试环境,例如连接数据库,打开浏览器动作执行完后需要还原关闭
setUp():准备环境,执行每个测试用例的前置条件;
tearDown():环境还原,执行每个测试用例的后置条件;
setUpClass():必须使用@classmethod装饰器,所有case执行的前置条件,只运行一次;
tearDownClass():必须使用@classmethod装饰器,所有case运行完后只运行一次;
例如:
# 重写TestCase的setUp() tearDown()方法:在每个测试方法执行前以及执行后各执行一次
def setUp(self):
print("开始")
def tearDown(self):
print("结束")
2、TestCase
类,unittest.TestCase
一个类class继承 unittest.TestCase,就是一个测试用例。一个TestCase的实例就是一个测试用例,就是一个完整的测试流程。
包括测试前环境准备setUp()|setUpClass()、执行代码run()、测试环境后的还原tearDown()|tearDownClass()。
继承自unittest.TestCase的类中,测试方法的名称要以test开头。且只会执行以test开头定义的方法(测试用例)
例如:
import unittest
class MyTestCase(unittest.TestCase):
# 继承自unittest.TestCase
# 重写TestCase的setUp()、tearDown()方法:在每个测试方法执行前以及执行后各执行一次
def setUp(self):
print("开始")
def test_something(self):
self.assertEqual(True, False)
def tearDown(self):
print("结束")
# 如果想在所有case执行之前准备一次测试环境,并在所有case执行结束后再清理环境
#classmethod是用来指定一个类的方法为类方法,没有此参数指定的类的方法为实例方法
# @classmethod
# def setUpClass(cls):
# print("开始")
# @classmethod
# def tearDownClass(cls):
# print("结束")
if __name__ == '__main__':
# 在main()中加verbosity参数,可以控制输出的错误报告的详细程度
# verbosity=*:默认是1;设为0,则不输出每一个用例的执行结果;2-输出详细的执行结果
unittest.main(verbosity=2)
3、TestSuite
把多个测试用例集合起来,一起执行,就需要testSuite。testsuite还可以包含testsuite
一般通过addTest()或者addTests()向suite中添加。case的执行顺序与添加到Suite中的顺序是一致的
例如:
if __name__ == '__main__':
# unittest.main() #使用main()直接运行时,将按case的名称顺序执行
suite = unittest.TestSuite()
suite.addTest(MyTestCase('test_01')) # 将需要执行的case添加到Test Suite中,没有添加的不会被执行
suite.addTest(MyTestCase('test_02'))
suite.addTest(MyTestCase('test_03'))
unittest.TextTestRunner().run(suite) # 将根据case添加的先后顺序执行
4、TestRunner
E:\python进阶\interfaceapi (htmltest.py)
import HTMLTestRunner
import unittest
from demo import testdemo
import os
#获取路径
ABSPATH = os.path.abspath(os.path.realpath(os.path.dirname(__file__)))
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(testdemo.MyTestCase("test_one"))
suite.addTest(testdemo.MyTestCase("test_something"))
#如果没指定路径需要创建路径
path=ABSPATH
if not os.path.exists(path):
os.makedirs(path)
else:
pass
report_path = "report.html"
report_title = u"测试报告"
desc = u"接口自动化测试报告详情"
fp = open(report_path, 'wb')
runner = HTMLTestRunner.HTMLTestRunner(fp, title=report_title, description=desc)
runner.run(suite)