用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)