在这里就测试方法上对本书第2.10节的基础上进行了一些优化,优化的方法主要是通过利用Python对数据库的访问以及接口测试相结合的方法来进行相应的测试。
表3-1为注册模块的测试用例,这里共设计了两个。
(1)注册一个数据库中已经存在的用户,系统应该提示“用户名已经存在!”。
(2)注册一个数据库中不存在的用户,系统应该注册成功,然后进入登录页面。
表3-1 注册模块的测试用例
编号 | 描述 | 期望结果 |
---|---|---|
1 | 注册的用户名已经存在 | 有提示信息“用户名已经存在!” |
2 | 注册的用户名不存在 | 注册成功,进入登录页面 |
loginRegConfig.xml
<node> <case> <username>Johnson</username> <password>12345</password> <email>Johnson@126.com</eamil> </case> <case> <TestId>loginReg-testcase001</TestId> <Title>用户注册</Title> <Method>post</Method> <Desc>注册用户名已经存在</Desc> <Url>http://127.0.0.1:8000/register/</Url> <InptArg>{"username":"Johnson","password":"12345","email":"Johnson5@126.com"}</InptArg> <Result>200</Result> <CheckWord>用户名已经存在!</CheckWord><!--- 通过“注册用户名不存在”测试完毕删除数据库记录 --> </case> <case> <TestId>loginReg-testcase002</TestId> <Title>用户注册</Title> <Method>post</Method> <Desc>注册用户名不存在</Desc> <Url>http://127.0.0.1:8000/register/</Url> <InptArg>{"username":"smith","password":"12345","email":"smith@126.com"}</InptArg> <Result>200</Result> <CheckWord>登录</CheckWord> </case></node> |
---|
第一个<case >...</case>为测试代码所用的初始化信息。将通过测试程序中的setUp()中由Python语言的基础类sqlite3(注意,在这里不是通过Django提供的数据库操作模块)向数据库中插入记录,然后运行程序来进行测试,最后测试结束,需要在tearDown()方法中将这些记录进行删除。在后面所有模块测试代码中都采用这样的方法。
为了今后方便,首先对一些方法进行封装。把本书第2.10.5节中getXML.py中的类GetXML封装在一个名为util.py的文件中,并且把头部的两行建立在这个类的构造方法中。
def __init__(self,myXmlFile): dom = minidom.parse(myXmlFile) self.root = dom.documentElement |
---|
这样,原先的getxmldata()方法就改造为
def getxmldata(self): #从XML中读取数据 TestIds = self.root.getElementsByTagName('TestId') Titles = self.root.getElementsByTagName('Title') Methods = self.root.getElementsByTagName('Method') Descs = self.root.getElementsByTagName('Desc') Urls = self.root.getElementsByTagName('Url') InptArgs = self.root.getElementsByTagName('InptArg') Results = self.root.getElementsByTagName('Result') CheckWords = self.root.getElementsByTagName('CheckWord') i = 0 mylists=[] for TestId in TestIds: mydicts={} #获取每一个数据,形成字典 mydicts["TestId"] = (TestIds[i].firstChild.data).strip() mydicts["Title"] = (Titles[i].firstChild.data).strip() mydicts["Method"] = (Methods[i].firstChild.data).strip() mydicts["Desc"] = (Descs[i].firstChild.data).strip() mydicts["Url"] = (Urls[i].firstChild.data).strip() mydicts["InptArg"] = (InptArgs[i].firstChild.data).strip() mydicts["Result"] = (Results[i].firstChild.data).strip() mydicts["CheckWord"] = (CheckWords[i].firstChild.data).strip() mylists.append(mydicts) i = i+1 return mylists |
---|
然后在这个类中获得User测试初始化信息的方法getUserInitInfo(),具体实现如下。
def getUserInitInfo(self):#从XML中读取数据 id = self.root.getElementsByTagName('id') id = (str(id[0].firstChild.data)).strip() username = self.root.getElementsByTagName('username') username = "\""+(str(username[0].firstChild.data)).strip()+"\"" password = self.root.getElementsByTagName('password') password = "\""+(str(password[0].firstChild.data)).strip()+"\"" email = self.root.getElementsByTagName('email') email = "\""+(str(email[0].firstChild.data)).strip()+"\"" values = id +","+username+","+password+","+email return values #返回的字符串values供插入数据库表good_user中使用 |
---|
这里最后形成的字符串values为插入User表中SQL语句values后的内容。然后在这个文件中建立一个DB类,主要用于封装实现对数据库的操作,现在先来建立以下几个方法。
class DB: #构造方法,获得sqlite3数据库文件的位置 def __init__(self): self.url = "C:\\Python35\\Scripts\\ebusiness\\db.sqlite3" #连接数据库连接 def connect(self): self.con = con = sqlite3.connect(self.url) self.cur = self.con.cursor() #关闭数据库连接 def close(self): self.cur.close() self.con.close() #向tablename表中插入数据values def insert(self,tablename,values): sql = "insert into "+tablename+" values ("+values+")" self.con.execute(sql) self.con.commit() #在tablename表,删除满足condtion条件的记录 def delete(self,tablename,condition): sql = "delete from "+tablename+" where ("+condition+")" self.con.execute(sql) self.con.commit() |
---|
(1)方法__init__()用于初始化数据库。
(2)方法connect()用于连接数据库。
(3)方法close()用于关闭数据库的连接。
(4)方法insert()用于向数据库表中插入数据。
(5)方法delete()用于向数据库表中删除满足条件的数据。
最后来介绍用户注册模块的测试代码。
#!/usr/bin/env python#coding:utf-8import unittest,requestsfrom util import GetXML,DB class myregister(unittest.TestCase): def setUp(self): print("--------测试开始--------") #定义数据库表名 self.userTable = "goods_user" #建立GetXML对象变量 xmlInfo = GetXML("registerConfig.xml") #获得初始化信息 self.userValues = xmlInfo.getUserInitInfo() #建立DB对象变量 self.dataBase= DB() #连接数据库 self.dataBase.connect() #插入初始化数据库 self.dataBase.insert(self.userTable,self.userValues) #获得所有测试数据 self.mylists = xmlInfo.getxmldata() def test_register(self): for mylist in self.mylists: #获取传输参数 payload = eval(mylist["InptArg"]) #获取测试URL url=mylist["Url"] #发送请求 try: if mylist["Method"] == "post": data = requests.post(url,data=payload) elif mylist["Method"] == "get": data = requests.get(url,params=payload) else: print ("Method 参数获取错误") except Exception as e: self.assertEqual(mylist["Result"],"404") else: #验证返回码 self.assertEqual(mylist["Result"],str(data.status_code)) #验证返回文本 self.assertIn(mylist["CheckWord"],str(data.text)) def tearDown(self): #获取初始化数据库中的记录主码 id = self.userValues.split(',')[0] #删除这条记录 self.dataBase.delete(self.userTable,"id="+id) #关闭数据库连接 self.dataBase.close() print("--------测试结束--------") if __name__=='__main__': #构造测试集 suite=unittest.TestSuite() suite.addTest(myregister ("test_register")) #运行测试集合 runner=unittest.TextTestRunner() runner.run(suite) |
---|
(1)在setUp方法中。
① 先定义在这里用到的数据库表名为goods_user。
② 通过语句xmlInfo =GetXML("registerConfig.xml")从XML文件中读入测试初始化数据并且通过self.userValues = xmlInfo.getUserInitInfo()把它放到变量self.userValues中。
③ 建立数据库连接,通过语句self.dataBase.insert(self.userTable,self.userValues)向数据库中插入设置测试需要的初始化信息。
④ 通过语句self.mylists =xmlInfo.getxmldata()获得测试数据。
(2)在测试程序中。
①通过循环语句for mylist in self.mylists遍历所有的测试数据。
②通过语句payload = eval(mylist["InptArg"])获取测试参数以及url=mylist["Url"]获取测试执行路径。
③通过判断语句mylist["Method"]是post还是ge来调用data =requests.post(url,data=payload)或者data=requests.get(url,params=payload)。
④通过断言语句self.assertEqual(mylist["Result"],str(data.status_code))验证返回码是否正确。
⑤通过断言语句self.assertIn(mylist["CheckWord"],str(data.text))判断验证的字符串是否在返回的文本中。
(3)在tearDown方法中。
①通过语句id = self.userValues.split(',')[0]初始化数据库用户数据的主键。
②通过语句self.dataBase.delete(self.userTable,"id="+id)来删除这条测试数据。
③断开数据库连接,结束测试。
星云测试
http://www.threadingtest.com/
奇林软件
http://www.kylinpet.com
联合通测
http://www.quicktesting.net