4. 接口测试
1)测试用例
表3-12为送货地址的添加与显示的测试用例。在这里设计两个测试用例。
(1)添加一个当前登录用户不存在的收货地址信息,系统应该添加成功。
(2)第二个测试用例添加一个当前登录用户已经存在的地址信息,系统应该报“这个地址已经存在!”的错误信息。
表3-12 送货地址的添加与显示的测试用例
编号 |
描述 |
期望结果 |
1 |
为当前登录用户添加一个新的地址信息 |
添加成功,并且可以正确地显示 |
2 |
为当前登录用户添加一个已经存在的地址信息 |
显示“这个地址已经存在!”错误信息 |
2)XML数据文件
在初始文件initInfo.xml中加入地址信息内容。
... <!--- 初始化收货地址信息 --> <case> <addressid>0</addressid><!--- 收货地址id --> <address>上海市外滩一号</address><!--- 收货地址名称 --> <phone>13688889999</phone><!--- 联系电话 --> <userid>0</userid><!--- 用户id,与初始化用户id一致 --> ...
地址信息addressConfig.xml
<? xml version="1.0" encoding="UTF-8"?> <node> <case> <login>1</login> </case> <!--- 为当前登录用户添加一个新的地址信息,显示在用户信息中 --> <case> <TestId>address-testcase001</TestId> <Title>地址信息</Title> <Method>post</Method> <Desc>为当前登录用户添加一个新的地址信息</Desc><!--- 描述里面有"添加一个新的地址信息",执行操作后程序会把这条记录删除 --> <Url>http://127.0.0.1:8000/add_address/1/</Url> <InptArg>{"address":"上海市延安中路100号","phone":"13681166561"}</InptArg> <Result>200</Result> <CheckWord>延安中路</CheckWord><!--- 与参数中address保持一致 --> </case> <!--- 为当前登录用户添加一个已经存在的地址信息 --> <case> <TestId>address-testcase002</TestId> <Title>地址信息</Title> <Method>post</Method> <Desc>为当前登录用户添加一个已经存在的地址信息</Desc> <Url>http://127.0.0.1:8000/add_address/1/</Url> <InptArg>{"address":"上海市外滩一号","phone":"13681166561"}</InptArg><!--- 参数中address与初始化地址名称信息保持一致 --> <Result>200</Result> <CheckWord>这个地址已经存在!</CheckWord> </case> </node>
3)测试代码
建立测试代码addressTest.py,实现方法与前面类似。
#开始测试 def test_address_info(self): for mylist in self.mylists: data = self.util.run_test(mylist,self.userValues,self.sign) #验证返回码 self.assertEqual(mylist["Result"],str(data.status_code)) #验证返回文本 #如果mylist["CheckWord"]标签中存在"NOT"字符串,调用断言方法assertNotIn() if "NOT" in mylist["CheckWord"]: self.assertNotIn(address,str(data.text)) #否则调用断言方法assertIn() else: self.assertIn(mylist["CheckWord"],str(data.text)) # 如果新建成功,删除刚建立的记录 if "添加一个新的地址信息" in mylist["Desc"]: payload = eval(mylist["InptArg"]) address = "\""+(str(payload["address"])).strip()+"\"" self.dataBase.delete(self.addressTable,"address="+address) print (mylist["TestId"]+" is passsing!")
由于后面的测试程序存在页面中不存在信息的验证,所以保留if "NOT" in mylist["CheckWord"]语句的验证。另外如果是新建的记录,那么验证后立即把这条记录删除。
3.6.2 送货地址的修改
1.urls.py
... url(r'^update_address/(?P<address_id>[0-9]+)/(?P<sign>[0-9]+)/$', views.update_address), ...
(1)address_id为修改地址的id。
(2)当sign=1 表示从用户信息进入添加送货地址页面。
(3)当sign=2 表示从订单信息进入添加送货地址页面。
2.views. py
... # 修改地址信息 #sign=1 从用户信息进入 #sign=2 从订单信息进入 def update_address(request,address_id,sign): util = Util() username = util.check_user(request) if username=="": uf = LoginForm() return render(request,"index.html",{'uf':uf,"error":"请登录后再进入"}) else: #获取指定地址信息 address_list = get_object_or_404(Address, id=address_id) #获取当前登录用户的用户信息 user_list = get_object_or_404(User, username=username) #获取用户id id = user_list.id #如果是提交状态 if request.method == "POST": #如果表单提交,准备获取表单信息 uf = AddressForm(request.POST) #表单信息验证 if uf.is_valid(): #如果数据准确,获取表单信息 myaddress = (request.POST.get("address", "")).strip() phone = (request.POST.get("phone", "")).strip() #判断修改的地址信息这个用户是否是否存在 check_address = Address.objects.filter(address=myaddress,user_id = id) #如果不存在,将表单数据修改并存进数据库 if not check_address: Address.objects.filter(id=address_id).update(address = myaddress,phone = phone) #否则报“这个地址已经存在!”的错误提示信息 else: return render(request,'update_address.html',{'uf':uf,'error':'这个地址已经存在!','address':address_list}) #获得当前登录用户的所有地址信息 address_list = Address.objects.filter(user_id=user_list.id) #如果sign==2,返回订单信息页面 if sign=="2": return render(request, 'view_address.html', {"user": username,'addresses': address_list}) #进入订单用户信息 #否则进入用户信息页面 else: response = HttpResponseRedirect('/user_info/') # 进入用户信息 return response #如果没有提交,显示修改地址页面 else: return render(request,'update_address.html',{'address':address_list})...
(1)登录用户通过语句address_list= get_object_or_404(Address, id=address_id)获取需要修改的地址信息。
(2)通过语句user_list= get_object_or_404(User, username=username)获得登录用户信息以及语句id =user_list.id获得登录用户数据库id。如果当前不是表单提交状态,显示修改表单提交信息,否则在验证表单信息合法性后获取表单数据。
(3)接下来验证地址信息是否在数据库中是否存在,确保不存在的前提下,通过语句Address.objects.filter(id=address_id).update(address =myaddress,phone = phone)将其修改内容更新到数据库中。
(4)最后根据sign=1还是sign=2返回页面view_address.html或者方法user_info。
3.模板
update_address.html
{%load staticfiles%} <? xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>修改地址</title> <!-- Bootstrap core CSS --> <link href="{%static 'css/signin.css'%}" rel="stylesheet"> <!-- Custom styles for this template --> <link href="{%static 'css/bootstrap.min.css'%}" rel="stylesheet"> <link href="{%static 'css/my.css'%}" rel="stylesheet"> </head> <body> <div> <form method="post" enctype="multipart/form-data"> <h2>修改地址</h2> <p><label for="id_address">地址:</label><input type="text" value="{{address.address}}" name="address" id="id_address" size="20" maxlength="100" required /></p> <p><label for="id_phone">电话:</label><input type="text" value="{{address.phone}}" name="phone" id="id_phone" size="20" maxlength="15" required /></p> <p style="color:red">{{error}}</p><br> <button class="btn btn-lg btn-primary btn-block" type="submit">修改</button><br> </form> </div><!-- /container --> </body> </html>
由于在修改的时候需要显示以前的地址信息内容,所以不能使用AddressForm类,只能用HTML语言把form信息写出来,见图3-18。
图3-18 修改收货地址
星云测试
奇林软件
联合通测
顾翔凡言:
软件测试正在生病,而且病得不轻,自动化测试被要不吹得太火,要不一点都不会,自动化比不过开发、测试又找不到缺陷,丢了西瓜也捡不到芝麻。