python自动化测试(3)- 自动化框架及工具
2026/9/23 8:01:20 网站建设 项目流程

自动化测试(3)自动化框架及工具1 概述

关于测试的方法论的手续, 都是基于之前文章里所提及的观点建立的, 且该观点是被提到的:

后面所谈到的 测试自动化 也将围绕着 接口自动化 来介绍。

本系列所挑选的测试语言乃是脚本语言, 鉴于其官方文档已然针对原理给出了较为明晰的阐释, 故而本文不会开展一些多余的翻译工作, 偏向于实战部分, 并且为了偏向实战, 还会结合IDE工具以及项目组织来施行讲解。

理由如下:

用于脚本编写的语言, 在进行开发以及迭代之时呈现出极为高的效率, 与之相关的第三方开发出的扩展库数量极多, 存在着许多能够直接拿来使用可供现成利用的工具。

进入自动化测试领域之前, 需先确立这样的价值观, 依据内部工程师所发软件测试的出版物提及的内容。

有成本的是软件的自动化测试, 且成本不低, 基本上等于是在原有的功能开发工程的基础之上, 再去建立一个平行的测试开发工程。

这意味着, 要是你对于自动化测试存有你的预期值, 那必然是要付出对应的代价以及精力的。不错的事物也是需要出色的人耗费大量的时间去达成的。

本文已然被收纳进合集, 名为《基于的互联网软件测试开发(自动化测试)-全集合》, 欢迎前往进行查看。

基于的互联网软件测试开发

2 测试框架

采取 当成 自动化编程语言, 进而自然而然就要采用 作为自动化测试框架喽。

下述部分的内容主要源自于 的官方文档, 本文只是做了些许翻译以及结构方面的简易调整。这部分归属于测试框架的基本原理与概念部分, 在开展代码编写以前, 有必要加以了解。

的单元测试框架, 它能够被视作是Java语言范畴之内用于单元测试的框架JUnit的语言实现版本, 并且不仅仅如此, 就连其作者之一Kent Beck, 其实就是JUnit的作者。

要达到如下目标:

为了达到以上目标,支持如下几个重要概念:

3 基本示例

如下示例也来自于官方文档 .py:

# coding:utf-8 """ 基本的自动化测试脚本 basic_demo.py """ __author__ = 'zheng' import unittest class TestStringMethods(unittest.TestCase): def setUp(self): print 'init by setUp...' def tearDown(self): print 'end by tearDown...' def test_upper(self): self.assertEqual('foo'.upper(), 'FOO') def test_isupper(self): self.assertTrue('FOO'.isupper()) self.assertFalse('Foo'.isupper()) self.assertTrue('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()""" 基本的自动化测试脚本 basic_demo.py """ __author__ = 'zheng' import unittest class TestStringMethods(unittest.TestCase): def setUp(self): print 'init by setUp...' def tearDown(self): print 'end by tearDown...' def test_upper(self): self.assertEqual('foo'.upper(), 'FOO') def test_isupper(self): self.assertTrue('FOO'.isupper()) self.assertFalse('Foo'.isupper()) self.assertTrue('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()

虽然官方文档里面介绍了几种组织测试用例脚本的方式:

独立测试函数单用例测试类多用例测试类

编写形态不一样, 组织方式也不一样, 可以去看官方文档。本文作者在研究过官方文档后, 对第三种方式多用例测试类最喜欢, 就是上面基本示例的那种方式, 这种方式具备如下特点:

在控制台中运行此程序:

src git:(master) python basic_demo.py init by setUp... Fend by tearDown... init by setUp... end by tearDown... .init by setUp... end by tearDown... . ====================================================================== FAIL: test_isupper (__main__.TestStringMethods) ---------------------------------------------------------------------- Traceback (most recent call last): File "basic_demo.py", line 24, in test_isupper self.assertTrue('Foo'.isupper()) AssertionError: False is not true ---------------------------------------------------------------------- Ran 3 tests in 0.001s FAILED (failures=1) src git:(master)init by setUp... Fend by tearDown... init by setUp... end by tearDown... .init by setUp... end by tearDown... . ====================================================================== FAIL: test_isupper (__main__.TestStringMethods) ---------------------------------------------------------------------- Traceback (most recent call last): File "basic_demo.py", line 24, in test_isupper self.assertTrue('Foo'.isupper()) AssertionError: False is not true ---------------------------------------------------------------------- Ran 3 tests in 0.001s FAILED (failures=1) src git:(master)

main函数对前面基础示范案例采用的途径很简便, 是直接使全部测试例运行起来, 将默认文本报告生成。实际上, 仅需对函数调用实施些易操作的变动, 就能够把这些测试例妥善构思编排, 进而得到切实带有效用的数据详情, 以此与信息系统整合, 构建出良好的拓展。

if __name__ == '__main__': # unittest.main() # 装载测试用例 test_cases = unittest.TestLoader().loadTestsFromTestCase(TestStringMethods) # 使用测试套件并打包测试用例 test_suit = unittest.TestSuite() test_suit.addTests(test_cases) # 运行测试套件,并返回测试结果 test_result = unittest.TextTestRunner(verbosity=2).run(test_suit) #生成测试报告 print("testsRun:%s" % test_result.testsRun) print("failures:%s" % len(test_result.failures)) print("errors:%s" % len(test_result.errors)) print("skipped:%s" % len(test_result.skipped))# unittest.main() # 装载测试用例 test_cases = unittest.TestLoader().loadTestsFromTestCase(TestStringMethods) # 使用测试套件并打包测试用例 test_suit = unittest.TestSuite() test_suit.addTests(test_cases) # 运行测试套件,并返回测试结果 test_result = unittest.TextTestRunner(verbosity=2).run(test_suit) #生成测试报告 print("testsRun:%s" % test_result.testsRun) print("failures:%s" % len(test_result.failures)) print("errors:%s" % len(test_result.errors)) print("skipped:%s" % len(test_result.skipped))

运行后生成的输出为:

src git:(master) python basic_demo.py test_isupper (__main__.TestStringMethods) ... init by setUp... FAIL end by tearDown... test_split (__main__.TestStringMethods) ... init by setUp... end by tearDown... ok test_upper (__main__.TestStringMethods) ... init by setUp... end by tearDown... ok ====================================================================== FAIL: test_isupper (__main__.TestStringMethods) ---------------------------------------------------------------------- Traceback (most recent call last): File "basic_demo.py", line 23, in test_isupper self.assertTrue('Foo'.isupper()) AssertionError: False is not true ---------------------------------------------------------------------- Ran 3 tests in 0.001s FAILED (failures=1) testsRun:3 failures:1 errors:0 skipped:0test_isupper (__main__.TestStringMethods) ... init by setUp... FAIL end by tearDown... test_split (__main__.TestStringMethods) ... init by setUp... end by tearDown... ok test_upper (__main__.TestStringMethods) ... init by setUp... end by tearDown... ok ====================================================================== FAIL: test_isupper (__main__.TestStringMethods) ---------------------------------------------------------------------- Traceback (most recent call last): File "basic_demo.py", line 23, in test_isupper self.assertTrue('Foo'.isupper()) AssertionError: False is not true ---------------------------------------------------------------------- Ran 3 tests in 0.001s FAILED (failures=1) testsRun:3 failures:1 errors:0 skipped:0

显而易见, 上面所呈现的输入结果已然针对测试结果展开了统计, 那些数据均为一次测试活动里的关键指标。这些数据能够进行入库操作, 与测试信息管理系统实现集成。在后期, 可生成仪表盘或者统计报表, 进而形成稳定的、关于产品测试的线路图, 不过这些都与开发有所关联了, 故而在此不再作过多叙述了。

通过结合上面所呈现的具体例子, 我们能够寻找到上一节理论部分所对应的具体实现对象, 没错, 是这样的, 对?

4 IDE工具

倘若要去开发代码的生产力, 那就得去介绍一款IDE工具, 不可否认, 它是当下最为专注或者专业的那种语言的IDE了, 在对方面也有着比较不错的支持。

主要支持如下:

4.1 运行和调试

对测试脚本提供了灵活的运行和调试支持。

借助特定举措, 开发人员能够不付诸编写main函数的行动, 进而达成如下这般的功能: 。

存在这样一种情况, “运行一个测试类的某个测试脚本”具备一定的实用性, 它适宜于在开发阶段, 能够迅速地针对单个的脚本展开开发以及进行一个运行调试这样关键且必要的动作。

使用方法:

先把光标朝着测试函数的里面移动, 接着随后按下运行快捷键ctrl + shift + F10, 此快捷键是有其对应的方案的。

要是打算进行断点调试,那么就要运用Debug模式, 如此一来, 便能够针对单个函数开展运行以及断点调试操作了。

当然, 并非一定要借助IDE才行, 通过特定操作, 也是能够将上述功能达成的, 然而比起这种方式, IDE提供了更为灵活因而也更为直接的选择选项。这仅仅是一些IDE的使用技巧罢了, 也就暂且不多作阐述了。

4.2 结果可视化

针对前面所提及的例子而言, 要是选择于IDE里运行这个程序, 那么将会看到如下这般的效果:

能够看见全部运行顺利通过, 要是特意把其中的一个搞成未通过的情形, 那么就会呈现出下面这样的结果:

4.3 生成测试报告

提供了导出功能, 此功能用于测试结果报告, 它在测试结果显示框上, 是一个功能按钮。

导出结果如下:

毋庸置疑, 要是不将与信息系统集成纳入考量范畴, 不把后续的仪表盘以及测试统计工作予以考虑, 单单只是想要生成报告的话, 此功能已然是足够的了。

在通常状况下, 去做自动化测试以及开发, 上面提及的那些技能已然完全能够达成要求了, 接下来所要做的事情便是借助各类计算机基本知识, 面对持续增多的业务需求, 进而不停地增添测试用例脚本了。

进行功能开发的项目, 其原理全都十分简单, 然而, 随着数量的不断增加, 都会逐渐形成规模, 测试开发工程同样如此。

5 项目组织

对之前介绍过的, 用于测试用例开发调试态的工具, 进行了阐述。然而, 若要切实纳入到持续集成的自动化体系之中, 显然绝不能依赖于IDE。而是要运用语言的组织与调用方式, 譬如: 需有函数作为执行的入口处, 等等。

后面啥时候有机会, 会再写文章, 对详细的技术实现细节进行相应介绍。

通过脱离IDE的项目组织方式,有如下优点:

6 测试平台

以自动化生成测试报告这个测试产物而言, 当下存在一些平台, 它们能够供给接口调用服务, 还具备报告展示以及分享功能, 具体要点可参考:

7 小结

本小部分内容, 主要讲述基于语言的自动化测试框架的一些设计思想, 以及基本使用示例。实际上, 工具的使用方法颇为简单, 然而, 怎样利用好这些工具去进行软件生产, 就需要其他计算机技能了。在后续的文章里, 将会从工程方面以及技术方面对此框架的应用展开深入的拓展。

(未完,待续。。。。)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询