Python实战项目:高血压检测项目调查问卷接口的测试

Python实战项目:高血压检测项目调查问卷接口的测试

在前面的Python实战项目中介绍过高血压检测项目和自动化综合测试的相关内容,那么如何结合自动化综合测试的内容进行高血压检测项目的测试呢,尤其是对于接口返回数据是否正确的测试内容,接口返回的是json数据,如何判断高血压的调查问卷最终提交后得到的是一个json数据,并判断这一json数据的正确,是如何在测试中下断言的。下面就专门以高血压检测项目调查问卷接口的测试来说明这个测试用例的写法。

首先根据如下图页面的用户调查问卷,对页面中每一个元素进行提取,并设置其中的内容。

根据图中所示,首先获取的是姓名的输入框,高血压项目在进行布局时使用的是jqm,对姓名的输入框使用的是name来定义的,没有为其设置id值,这样就只能需要selenium模块中的findelementbyname方法通过名字来获取姓名这个输入框,然后完成自动化测试用sendkeys向这个姓名输入框输入内容。语句如下:

myname=self.driver.find_element_by_name(“username)”
myname.send_keys(“张三”)

接下来,获取name=”sex”命名的单选钮标签,其标签名为input,类型type值是radio。但是,这里要特别注意,当我们在网页找到“性别”单选钮选项,然后右键“检查元素”时发现,被高亮显示的元素是“,没有把高亮显示在这个元素上,这是jqm这个框架决定的,点击单选钮元素时被点击的是“男”这个性别单选钮样式定义的地方,并没有选择在这个标签上,这是这个框架在浏览器中反映出来的结果,所以我们无法通过这个元素去定位性别这个问卷调查项。问题在于做jqm布局时只对有我们自定义的元素name=”sex”,而这个元素还无效,其它的元素都是jqm定义的样式,无法正确定义元素的唯一性。如下图所示。

我们可以通过name属性值”sex”来定位调查问卷中“性别”这一个选项,但如果进行点击click()方法,这个操作并不发生在这个元素上,而是发生在与其同级的label元素标签下的元素上,这样的元素定位起来变得复杂,但如果我们定义在和label的同一个父级元素上,这个点击操作是可以实现的,子类的点击事件可以传递到父类元素上,这是由前端的js冒泡原理实现的。因此,就可以定位于以name=”sex”命令的input标签上,再调用xpath技术中的parent找到第一个父级div元素,继而执行click()操作,完成了对“性别”标签的点击自动化选择。代码如下。

mysex=self.driver.find_element_by_xpath(“//input[@name=’sex’]/parent::div[1]”)
mysex.click()

注意,这两句代码中使用了findelementby_xpath来定位具体元素, 参数采用了xpath的表达式技术,“//input[@name=’sex’]”实现了定位于网页文件中任意的input标签,这个input标签同时还要满足其属性中name的值为“sex”,这样就找到了“性别”的选择单选钮,jqm技术决定了不能点击,就调用后面的“parent::div[1]”实现找到“性别”单选钮其父级元素的第一个div元素,就是input[@name=”sex”定位的“性别”单选钮父级元素。在后面的代码中执行click()就可以实现点击操作。

定位了性别后,再进行身高和体重的元素定位,为身高的输入框sendkeys输入身高值,为体重的输入框sendkeys输入体重值。这两个输入框的name分别为,身高输入框name属性值为tall,体重输入框name属性值为weight。其获取元素的方法可以使用根据name值来获取,即使用selenium模块的find_elementbyname。代码如下:

mytall=self.driver.find_element_by_name(“tall”)
mytall.send_keys(“1.79”)
myweight=self.driver.find_element_by_name(“weight”)
myweight.send_keys(“80”)

对于后面的“是否吸烟”及“是否饮酒”这两个选项,其分析方法和“性别”的选择也是一样的,也是由于jqm框架的原因,不能直接在name=”smoke”或者name=”drink”这样的input元素上使用click()方法,达不到点击选择的目的。只能分别定位到name=”smoke”和name=”drink”两个元素的父级元素上,再进行点击操作,就可以完成“是否吸烟”及“是否饮酒”这两个选项的选择。代码如下。

mysmoke=self.driver.find_element_by_xpath(“//input[@name=’smoke’]/parent::div[1]”)
mysmoke.click()
mydrink=self.driver.find_element_by_xpath(“//input[@name=’drink’]/parent::div[1]”)
mydrink.click()

代码到这里,基本上完成了高血压项目中各个选择项目的填充,接下来就需要点击“提交”按钮来获取接口的信息,“提交”按钮的获取由于没有设置id和name ,但一个表单页面中只有一个type属性值为”submit”的按钮是可以通过xpath技术获取的。代码如下。

 

mybtn=self.driver.find_element_by_xpath(“//button[@type=’submit’]”)
time.sleep(10)
mybtn.click()

注意,代码在mybtn这个按钮执行click()方法之前使用time.sleep(10)进行时间上的延时,其目的是为了在自动化模拟操作过程中能够看到每一项选择的数据是否正确。在click()事件发生后,前端要将数据上传到服务器中,服务器接收数据进行存储,并返回前端json数据,因此在click()事件后也需要time.sleep(10)等待一段时间后,再进行截图和断言。

为了能够更好的查看json数据的有效性或者请求失败后的失败码提示,完成测试用例基本要求“断言”之前,必须通过self.driver.getscreenshotas_base64()方法来对提交后的返回json数据页面进行截图。

测试用例的最后是需要进行断言的,对于json数据这样的接口,如何进行断言,可以通过判断预期的json值和实际的json值进行对比。这里我们已经截图,其实可以通过截图来判断json数据是否正确,但是断言是必须的,我们就通过判断提交后的页面中是否含有“application/json”这样的字符串来判断,如果含有“application/json”这样的说明,那一定是一个json数据的页面,再通过截图来判断json数据是否正确,也可以实现这样的功能。点击请求后,获取源码可以通过self.driver.pagesource来获得,在这样的源码中find元素去寻找“application/json”这样的数据,如果有的话,其find的结果值必然大于等于0。通过这样的逻辑可以做一个大于等于零的断言,断言的两者就是pagesource中find(“application/json“)与0之间的比较。截图和断言代码如下。

self.imgs.append(self.driver.get_screenshot_as_base64())
self.assertGreaterEqual(self.driver.page_source.find(“application/json”),0)

整个测试用例和主程序中产生测试报告的完整代码如下。

from selenium import webdriver
import unittest
import time
from utils.HTMLTestRunner_Chart import HTMLTestRunner
class 高血压测试(unittest.TestCase):
    #测试用例的启动
    def setUp(self):
        self.driver=webdriver.Firefox()
        self.driver.get("http://localhost:8000/user/")
        self.imgs=[]
    def 验证高血压问卷信息填写后的提交的json接口返回(self):
        myname=self.driver.find_element_by_name("username")
        myname.send_keys("张三")
        #find_element是寻找一个元素,find_elements是寻找一堆元素
        mysex=self.driver.find_element_by_xpath("//input[@name='sex' and @value='0']/parent::div[1]")
        mysex.click()
        #传入身高
        mytall=self.driver.find_element_by_name("tall")
        mytall.send_keys("1.79")
        #传入体重
        myweight=self.driver.find_element_by_name("weight")
        myweight.send_keys("80")
        #传入是否吸烟,与性别同
        mysmoke=self.driver.find_element_by_xpath("//input[@name='smoke' and @value='1']/parent::div[1]")
        mysmoke.click()
        #传入是否饮酒,与性别方法相同
        mydrink=self.driver.find_element_by_xpath("//input[@name='drink' and @value='0']/parent::div[1]")
        mydrink.click()
        #对提交按钮执行click()提交
        mysubmit=self.driver.find_element_by_xpath("//button[@type='submit']")
        time.sleep(10)
        mysubmit.click()
        time.sleep(20)
        self.imgs.append(self.driver.get_screenshot_as_base64())
        #然后如何下断言。断言是否为application/json
        self.assertGreaterEqual(self.driver.page_source.find("application/json"),0)

    #测试用例的关闭
    def tearDown(self):
        self.driver.quit()
#完成在主程序中调用
if __name__=="__main__":
    suite=unittest.TestSuite()
    suite.addTest(高血压测试("验证高血压问卷信息填写后的提交的json接口返回"))
    with open('result.html','wb') as f:
        runner=HTMLTestRunner(f,verbosity=2,title="高血压测试报告",description="这是关于高血压项目功能的相关测试")
        runner.run(suite)

项目对应的视频地址:
高血压检测10-高血压项目测试用例自动化测试
https://www.bilibili.com/video/BV1iy4y1E75r/

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值