Web自动化测试框架实战-基于unittest

随着自动化脚本数量的增加,用例及测试数据的组织和维护,公共模块的复用,用例挑选及执行控制,或者团队协作及用例编写规范化,我们便需要引入自动化测试框架。
框架是应用的组织架构,一般包含代码、配置、数据、日志、依赖的组织,可复用模块的抽取以及运行控制等。就像从一盘散沙的武装人员,到一个军队。框架是由脚本集合发展到应用(包含测试项目)的一种必然选择。
框架的基本功能一般包括:

  • 代码、配置文件、数据文件等的分类组织。
  • 依赖管理。
  • 公共模块的复用。
  • 运行流程及控制。

另外,从设计目标来看,框架应该具有易用、健壮稳定、良好的性能,通过配置或参数提供灵活的使用方式,以及易调试和维护(如提供运行日志)等特性。
测试框架是为测试而设计的框架。测试框架一般还要包含用例编写、丰富的断言方法、用例组织、测试准备和清理方法、执行测试、生成测试报告等功能。
相比于一堆脚本集合,测试框架一般具有以下优点。

  • 用例执行互相独立,一个用例失败不影响其他用例执行和验证。
  • 清晰的用例执行状态,如成功、失败、出错、跳过等以及系统的测试报告。
  • 灵活的用例挑选及批量运行。
  • 提供丰富的断言(期望结果与实际结果的对比)方法。
  • 提供不同范围的测试准备和清理方法。
  • 在特定环境不满足条件时,跳过用例。

Python中常用的测试框架有Unittest、Nose、Pytest以及Robot Framework等。其中Unittest是Python自带的测试框架,提供基础的用例管理和测试控制功能,使用灵活易于定制。本章以unittest及Selenium为基础来讲解Web自动化测试框架的搭建流程。Pytest和Robot Framework将在其他章进行讲解。

9.1 Unittest基本使用#

Unitest是Python自带的单元测试框架,依照JUnit编写,和其他语言的的主流单元测试框有着相似的风格。Unittest中主要包含TestCase测试用例、TestSuite测试套件、TestFixture测试准备及清理方法和TestRunner测试运行器等主要概念,另外还包含TestLoader用于批量加载用例生成测试套件,TestResult用于在TestRunner中记录测试结果。Unittest的模型关系及运作流程如图9.1所示。


图9.1 Unittest模型关系及运作流程

编写测试用例时,需要编写一个类(一般约定以Test开头),并继承unittest.TestCase。每个测试类包含测试方法(测试用例)及TestFixture测试准备和清理方法两部分。测试方法一般约定为名称已test开头(测试类中非已test开头的方法不作为用例执行,一般可以用作辅助步骤等)。每个测试方法在执行时会实例化为一个TestCase对象来运行。同时测试用例父类unittest.TestCase中提供了丰富的断言(测试对比)方法来验证结果。

TestFixture也译做测试脚手架或者测试夹具。包含setup测试准备和teardown测试清理两类方法,分别在用例执行前执行和用例执行后执行,像三明治的两片面包一样将我们的正菜测试用例夹在其中。TestFixture提供不同范围的测试准备和清理,包含测试用例级、测试类级和测模块级。

TestSuite测试套件用来挑选和组织用例。除了使用测试套件自带的addTest添加用例方法添加用例外,还可以使用TestLoader用例加载器对象来批量添加一个测试模块、一个测试类等快速生成一个测试套件对象。同时测试套件支持嵌套,执行时按用例及子套件添加顺序进行深度遍历执行。

TestRunner用于测试套件、其中的用例各个级别的TestFixture的运行控制及异常处理。TestRunner中包含一个TestResult对象,穿梭于各个用例及套件中记录并实时输出结果。

用例编写#

Unittest测试用例编写一般应遵循以下步骤。
(1)测试脚本(测试模块)约定以test开头。
(2)测试类约定以Test开头,并继承unittest.TestCase。
(3)测试方法(测试用例)约定以test开头,可以包含多个步骤,及多个断言。

注意:测试类中不应覆盖父类的__init__方法,否则会破坏Unittest将每个测试方法生成测试用例对象的过程。

测试类TestCase#

测试类编写示例如下。

 

Copy

import unittest class TestDemo(unittest.TestCase): """测试类示例""" def add(self, a, b): # 非test开头不作为用例 ​ return a + b def test_add_int(self): ​ """测试整数相加""" # 使用docstring进行用例描述 ​ s = self.add(1, 2) ​ self.assertEqual(s, 3) # 实际结果, 期望结果 def test_add_float(self): ​ """测试浮点数相加""" ​ s = self.add(10000.1, 0.1) ​ self.assertEqual(s, 10000.2) def test_add_str(self): ​ """测试字符串相加""" ​ s = self.add('10', '1') ​ self.assertEqual(s, '11') if __name__ == '__main__': unittest.main()

上例测试类中的add方法非test开头,不作为用例运行,一般测试类中的非测试方法可以作为辅助步骤供测试方法调用。
测试方法可以使用docstring(一对三个双引号中间的字符串),来提供用例描述。用例描述会详细模式下显示。
self.assertEqual(s,3)是父类unittest.TestCase提供的一种断言方法,用于断言相等。在用例中也可以直接使用Python自带的assert语句,如assert s==3。但是相比来说使用TestCase类提供的断言方法,在失败信息中可以查看到更清晰的结果对比。
if __name__ == '__main__'表示如果本模块独立执行(非其他模块调用),unittest.main()为当前脚本提供一个命令行接口(支持多种运行参数),在运行脚本时默认运行当前测试模块按约定规则(测试类以Test开头,测试方法以test开头)所能发现的所有用例。
执行脚本,运行结果如下。

 

Copy

..F ====================================================================== FAIL: test_add_str (__main__.TestDemo) 测试字符串相加 ---------------------------------------------------------------------- Traceback (most recent call last): File "/Users/superhin/Desktop/test_demo.py", line 22, in test_add_str self.assertEqual(s, '1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值