1. 自动化测试模型介绍
随着自动化测试技术的发展,演化为了集中模型:线性测试、模块化驱动测试、数据驱动测试和关键字驱动测试。
下面分别介绍这几种自动化测试模型的特点。
1.1 线性测试
通过录制或编写对应用程序的操作步骤产生相应的线性脚本,每个测试脚本相对独立,且不产生其他依赖与调用,这也是早期自动化测试的一种形式:它们其实就是单纯的来模拟用户完整的操作场景。
前面写的所有文章所编写的测试脚本都属于线性测试。
这种模型的优势就是每一个脚本都是完整且独立的。所以,任何一个测试用例脚本拿出来都可以单独执行。当然,缺点也相当明显,测试用例的开发与维护成本很高。
开发成本高,测试用例之间可能会存在重复的操作,不得不为每一个用例去录制或编写这些重复的操作。例如每个用例中重复的用户登录和退出操作等。
维护成本高,正因为测试用例之间存在重复的操作,所以当这些重复的操作发生改变时,就需要逐一的对它们进行修改。例如登录输入框的定位发生了改变,就需要对每一个包含登录的用例进行调整。
1.2 模块化驱动测试
正是由于线性测试的缺陷非常明显,因此早期的自动化编程专家就考虑用新的自动化测试模块来代替线性测试。做法也很简单,借鉴了编程语言中模块化的思想,把重复的操作独立成公共模块,当用例执行过程中需要用到这一门课操作时则被调用,这样就最大限度的消除了重复,从而提高测试用例的可维护性。
提高了开发效率,不用重复编写相同的操作脚本。例如,已经写好一个登录模块,后续测试用例在需要登录的地方调用即可。
简化了维护的复杂性,加入登录按钮的定位发生了变化,那么只需修改登录模块的脚本即可,对于所有调用登录模块的测试脚本来说不需要做任何修改。
1.3 数据驱动测试
虽然模块化驱动测试很好的解决了脚本的重复问题,但是自动化测试脚本在开发的过程中还是发型了诸多不便。例如,现在我要测试不同用户的登录,首先用的是“张三”的用户名登录,下一个测试用例要换成“李四”的用户名登录。在这种情况下,还是需要重复的编写登录脚本,因为虽然登录的步骤相同,但是登录所用的测试数据不同。
于是,数据驱动测试的概念就为解决这类问题而被提出。从它的本意来解释,就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。这听上去的确是个高大上的概念,而在早期的商业自动化工具中,也的确把这一概念作为一个卖点。对于数据驱动所需要的测试数据,也是通过根据工具内置的Datapool管理。
数据驱动说的直白点就是数据的参数化,因为熟人数据的不同从而引起输出结果的不同。
不管我们读取的是定义的数组、字典,或者是外部文件(Excel、csv、txt、xml等),都可以看作是数据驱动,它的目的就是实现数据与脚本的分离。
这样做的好处同样是显而易见的,它进一步增强了脚本的复用性。同样以道路为例,首先是重新设计登录模块,使其可以接受不同的数据,把接收到的数据作为登录操作的一部分。这样就可以很好的适应相同操作、不同的数据的情况。当指定登录用户是“张三”时,那么登录之后的结果就是欢迎“张三”;当指定登录用户是“李四”时,登录结果就显示“欢迎李四”。这就是数据驱动所希望达到的目的。
1.4 关键字驱动测试
理解了数据驱动后,无非是把“数据”换成“关键字”,通过关键字的改变引起测试结果的改变。
目前市面上典型关键字驱动工具以OTP(目前已更名为UFT-Unified Funcionl Testing)、Robot Framework(RIDE)工具为主。这类工具封装了底层的代码,提供给用户独立的图像界面,以“填表格”的形式免除测试人员对写代码的恐惧,从而降低脚本的编写难度,我们只需使用工具所提供的关键字以“过程式”的方式来编写用例即可。(我公司使用的是Robot Framework)
当然,selenium家族中的selenium IDE也可以看作是一种传统的关键字驱动的自动化工具。
2. 模块化驱动测试案例
通过对自动化测试模型的介绍,我们了解了模块化设计的优点。这里我们就以具体的例子来介绍模块的具体应用,当然它的基础是Python语言中函数与类方法的调用。
线性测试代码:
- from selenium import webdriver
- wd = webdriver.Chrome()
- wd.implicitly_wait(10)
- #进入某网站
- wd.get('https://www.xx.com')
- #登录
- wd.find_element_by_id("id1").clear()#防止输入框里面有内容
- wd.find_element_by_id("id1").send_keys("username")
- wd.find_element_by_id("id2").clear()
- wd.find_element_by_id("id2").send_keys("password")
- wd.find_element_by_id("id3").click()
- #进入网站后的操作
- #......
- #退出
- wd.find_element_by_l