接下来再对测试程序以及配置文件进行优化,把loginConfig.xml和registerConfig.xml这两个文件进行合并,形成loginRegConfig.xml。
<? xml version="1.0" encoding="UTF-8"?> <node> <case> <login>0</login><!--- 0表示执行不需要登录、1表示需要登录 --> </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":"000000","email":"Johnson5@126.com"}</InptArg><!--- 用户名同initInfo.xml中用户信息 --> <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":"000000","email":"smith@126.com"}</InptArg><!--- 用户名不同于initInfo.xml中用户信息 --> <Result>200</Result> <CheckWord>登录</CheckWord> </case> <!--- 登录操作,正确用户名,错误密码 --> <case> <TestId>loginReg-testcase003</TestId> <Title>用户登录</Title> <Method>post</Method> <Desc>正确用户名,错误密码</Desc> <Url>http://127.0.0.1:8000/login_action/</Url> <InptArg>{"username":"Johnson","password":"123456"}</InptArg><!--- 密码不同于initInfo.xml中用户信息 --> <Result>200</Result> <CheckWord>用户名或者密码错误</CheckWord> </case> <!--- 登录操作,错误用户名,正确密码 --> <case> <TestId>loginReg-testcase004</TestId> <Title>用户登录</Title> <Method>post</Method> <Desc>错误用户名,正确密码</Desc> <Url>http://127.0.0.1:8000/login_action/</Url> <InptArg>{"username":"smith","password":"000000"}</InptArg><!--- 用户名不同于initInfo.xml中用户信息 --> <Result>200</Result> <CheckWord>用户名或者密码错误</CheckWord> </case> <!--- 登录操作,错误用户名,错误密码 --> <case> <TestId>loginReg-testcase005</TestId> <Title>用户登录</Title> <Method>post</Method> <Desc>错误用户名,错误密码</Desc> <Url>http://127.0.0.1:8000/login_action/</Url> <InptArg>{"username":"smith","password":"123456"}</InptArg><!--- 用户名、密码均不同于initInfo.xml中用户信息 --> <Result>200</Result> <CheckWord>用户名或者密码错误</CheckWord> </case> <!--- 登录操作成功 --> <case> <TestId>loginReg-testcase006</TestId> <Title>用户登录</Title> <Method>post</Method> <Desc>正确用户名,正确密码</Desc> <Url>http://127.0.0.1:8000/login_action/</Url> <InptArg>{"username":"Johnson","password":"000000"}</InptArg><!--- 用户名、密码均同于initInfo.xml中用户信息 --> <Result>200</Result> <CheckWord>查看购物车</CheckWord> </case> </node>
然后合并loginTest.py和registerTest.py,形成loginRegTest.py。
#!/usr/bin/env python #coding:utf-8 import unittest,requests from util import GetXML,DB,Util class loginreg(unittest.TestCase): def setUp(self): print("--------测试开始--------") xmlfile = "loginRegConfig.xml" #建立GetXML对象变量 xmlInfo = GetXML() #获得是否需要登录的信息 self.sign = xmlInfo.getIsLogin(xmlfile) #获得所有测试数据 self.mylists = xmlInfo.getxmldata(xmlfile) #定义数据库表名 self.userTable = "goods_user" #获得初始化信息 self.values = xmlInfo.getUserInitInfo() #建立DB对象变量 self.dataBase = DB() Util.insertTable(self.dataBase,self.userTable,self.values) def test_register(self): for mylist in self.mylists: data = Util.run_test(mylist,self.values,self.sign) #验证返回码 self.assertEqual(mylist["Result"],str(data.status_code)) #验证返回文本 self.assertIn(mylist["CheckWord"],str(data.text)) # 如果注册成功,删除刚建立的记录 if "注册用户名不存在" in mylist["Desc"]: payload = eval(mylist["InptArg"]) username = "\""+payload["username"]+"\"" self.dataBase.delete(self.userTable,"username="+username) print (mylist["TestId"]+" is passsing!") def tearDown(self): Util.tearDown(self.dataBase,self.userTable,self.values) print("--------测试结束--------") if __name__=='__main__': #构造测试集 suite=unittest.TestSuite() suite.addTest(myregister("test_register")) #运行测试集合 runner=unittest.TextTestRunner() runner.run(suite)
在这里加上这三行代码。
if "注册用户名不存在" in mylist["Desc"]: payload = eval(mylist["InptArg"]) username = "\""+payload["username"]+"\"" self.dataBase.delete(self.userTable,"username="+username)
这个在处理注册成功以后是需要删除建立起来的记录,其目的是保证每个测试程序间的互相独立性。
刚才在interface/util.py中封装了下tearDown(),现在来封装setUp()。在Util类里面建立一个inivalue()方法。
#初始化信息 def inivalue(self,dataBase,ordertable,sign): #获得初始化信息 if sign == "0": values = GetXML.getUserInitInfo(self) elif sign == "1": values = GetXML.getGoodInitInfo(self) elif sign == "2": values = GetXML.getAddressInitInfo(self) elif sign == "3": values = GetXML.getOrdersInitInfo(self) elif sign == "4": values = GetXML.getOrderInitInfo(self) else: print("sign is error in function inivalue") #建立记录 self.insertTable(dataBase,ordertable,values) return values
考虑到下面模块的使用,把用户、商品、收货地址、单个订单和总订单的初始化均写在这里了。
这样loginRegTest.py改造成。
#!/usr/bin/env python #coding:utf-8 import unittest,requests from util import GetXML,DB,Util class myregister(unittest.TestCase): def setUp(self): print("--------测试开始--------") xmlfile = "loginRegConfig.xml" #建立GetXML对象变量 xmlInfo = GetXML() #获得是否需要登录的信息 self.sign = xmlInfo.getIsLogin(xmlfile) #获得所有测试数据 self.mylists = xmlInfo.getxmldata(xmlfile) #建立DB变量 self.dataBase = DB() #建立util变量 self.util =Util() #初始化用户记录 self.userTable = "goods_user" self.userValues = self.util.inivalue(self.dataBase,self.userTable,"0") ...
而userTest.py改造成。
#!/usr/bin/env python #coding:utf-8 import unittest,requests from util import GetXML,DB,Util class userTest(unittest.TestCase): def setUp(self): print("--------测试开始--------") xmlfile = "userInfoConfig.xml" #建立GetXML对象变量 xmlInfo = GetXML() #获得是否需要登录的信息 self.sign = xmlInfo.getIsLogin(xmlfile) #获得所有测试数据 self.mylists = xmlInfo.getxmldata(xmlfile) #建立DB变量 self.dataBase = DB() #建立util变量 self.util =Util() #初始化用户记录 self.userTable = "goods_user" self.userValues = self.util.inivalue(self.dataBase,self.userTable,"0") ...
可以看出以后的接口测试代码可以变得非常的简单,这样接口测试工作主要在于设计测试用例和书写XML文件(即设计测试数据),而不是维护测试代码了,因为大部分代码已经被封装了。最后建立一个runtest.py文件,内容如下。
#!/usr/bin/env python #coding:utf-8 import unittest from HTMLTestRunner import HTMLTestRunner test_dir='./' discover=unittest.defaultTestLoader.discover(test_dir,pattern="*Test.py") if __name__=='__main__': runner=unittest.TextTestRunner() #以下用于生成测试报告 fp=open("result.html","wb") runner =HTMLTestRunner(stream=fp,title='测试报告',description='测试用例执行报告') runner.run(discover) fp.close()
运行这个测试代码,形成测试报告,如图3-5所示。
图3-5 测试报告
以后测试代码均以Test.py结尾,就可以使用这个TestSuite文件了。
星云测试
奇林软件
联合通测
顾翔凡言:
软件测试正在生病,而且病得不轻,自动化测试被要不吹得太火,要不一点都不会,自动化比不过开发、测试又找不到缺陷,丢了西瓜也捡不到芝麻。