测试驱动开发模式在今天已经不是什么新鲜事了,它要求开发在写业务代码的时候,先写出测试代码,,同时单元测试例子决定了如何来写产品的代码,并且不断的成功的执行编写的所有的单元测试例子,不断的完善单元测试例子进而完善产品代码,这样随着功能的开发完成,测试代码也会对应的完成,很显然,这是一个全新的开发模式,在一定程度上,可以完全的提高软件的质量,以及开发可以对自己写的代码进行一个全面的评估和测试。TDD模式是一个很大的概念,在这里,我仅仅介绍下测试驱动与自动化的融合以及精简自动化的测试代码,仅仅达到这个目的而已。对TDD开发模式感兴趣的同学,可以查看其有关的资料。
一、一个登录引发的思考
已登录V客网为例,登录成功后,验证用户昵称是否正确,然后退出系,这样的一个过程,来说明精简代码的第一步,最原始的代码见如下:
#coding:utf-8
import unittest
from selenium import webdriver
class developTest(unittest.TestCase):
def setUp(self):
self.driver=webdriver.Firefox()
self.driver.implicitly_wait(30)
self.driver.maximize_window()
self.driver.get('http://my.weke.com/login.html')
self.addCleanup(self.driver.quit)
def testLogin(self):
#用户名输入
name=self.driver.find_element_by_id('l-1')
name.clear()
name.send_keys('yourName')
#密码输入
passwd=self.driver.find_element_by_id('l-2')
passwd.clear()
passwd.send_keys('yourPassword')
#点击登录
self.driver.find_element_by_id('l-4').click()
#获取到用户昵称
userName=self.driver.find_element_by_xpath(".//*[@id='user-info']/a/span")
userInfo=userName.text
#退出系统
userName.click()
self.driver.find_element_by_xpath(".//*[@id='user-info']/ul/li[3]/a").click()
self.assertTrue(userInfo in 'linux')
if __name__=='__main__':
unittest.main(verbosity=2)
如上的代码,我们成功的实现了登录V客网,获取到用户的昵称,退出系统,以及验证用户昵称这样的一个过程,但是问题也就来了,如果我登录系统N次以及退出系统次,那么就意味着写登录退出就得N次,很明显,这样很多的登录退出的代码都是一致的,增加了工作量,如下,我通过把登录,退出,获取到用户昵称,写成一个单独的函数,然后使用到了直接调用对应的函数(调用的时候记得导入),文件名称是vke.py,具体代码为如下:
#coding:utf-8
#登录函数
deflogin(driver,username='13484545195',password='server'):
driver.find_element_by_id('l-1').send_keys(username)
driver.find_element_by_id('l-2').send_keys(password)
driver.find_element_by_id('l-4').click()
#获取用户昵称
def getName(driver):
returndriver.find_element_by_xpath(".//*[@id='user-info']/a/span").text
#退出系统
def exitSystem(driver):
driver.find_element_by_xpath(".//*[@id='user-info']/a/span").click()
driver.find_element_by_xpath(".//*[@id='user-info']/ul/li[3]/a").click()
有了如上的函数后,测试脚本就精简很多了,测试脚本见如下:
#coding:utf-8
importunittest
fromselenium import webdriver
import vke
classdevelopTest(unittest.TestCase):
def setUp(self):
self.driver=webdriver.Firefox()
self.driver.implicitly_wait(30)
self.driver.maximize_window()
self.driver.get('http://my.weke.com/login.html')
self.addCleanup(self.driver.quit)
def testLogin(self):
vke.login(self.driver)
userInfo=vke.getName(self.driver)
vke.exitSystem(self.driver)
self.assertTrue(userInfo in 'linux')
if__name__=='__main__':
unittest.main(verbosity=2)
通过这样的一个实例,我们把测试脚本精简了很多,其实还可以把最后一步精简下,但是我一般感觉,最后一步还是在测试代码中比较好,因此我们可以总结出如下几点:
1、对于某些公用的功能,如登录,退出,单独写成一个函数,需要的时候,直接调用函数;
2、验证点一定要写在最后一步,本实例验证用户昵称部分,不可以写在退出之前验证,先获取到用户昵称,退出系统,再验证用户昵称;
3、尽量保持测试脚本与页面对象元素分离开,这样即使系统需求变更或者开发把页面元素更改了,我们只在一个地方维护,而不影响testcase的脚本。
虽然我们实现了把测试用例的代码精简化,实现了测试脚本与页面对象的分离,实现了后期维护页面对象只在一个地方维护,但是还是存在很多的缺点,我们可不可以把使用到的数据,页面对象放在如.csv.xml文件中了?答案当然是可以,下来部分我们重点介绍把使用到的数据放在.txt,.csv,.xlsx,xml文件中,同时介绍ddt模块的安装以及使用方法,来继续重构我们的测试代码。