• 0
  • 1
分享

本文所用到的案例:

14982672_201805220938081sIqA.png


图一为登录首页,当输入用户名和密码后,点击【登录】按钮,如果用户名密码正确进入图三登录成功页面,否则弹出错误消息;点击【进行注册】按钮进入图二进行注册;点击【清除】按钮,清除数据库中的所有数据,这个按钮是为测试而临时设置的,正式产品中将会取消。

图二为注册页,当输入用户名和密码后,点击【注册】按钮,当输入的用户名在数据库中不存在,注册成功,返回图一的登录页面,否则弹出错误消息。

图三为登录成功页,当在图一中输入正确的用户名和密码后,进入这个页面,这里的"Hello world"将变为"Welcome "+用户名。


正文部分

谈起软件自动化测试,许多没有从事过软件开发的同学来说,感觉比较困难。但是你一旦了解了软件自动化测试的步骤后,然后再进行自动化测试代码的开发就比较方便了。本文主要探讨自动化测试的三大步骤以及接口自动化测试的四大小步骤以及基于UI自动化测试的三大小步骤。

软件自动化测试的三大步骤为:设置环境、执行测试和清除环境;接口自动化测试的四大小步骤为:组织协议包、发送协议包、接受协议包和分析协议包;基于UI自动化测试的三大小步骤为:获取对象、操作对象和断言。

1)我们先来考虑软件自动化测试的三大步骤,分为设置环境、执行测试和清除环境。

在python的unittest测试框架中对应 setup()、test_XXX()和teardown();在Java的JUnit测试框架中对应@before、@test和@after。在这里我特别需要指出,在设置环境的时候我们也需要清除环境,这是为什么呢?各位都知道我们的自动化测试程序往往是一次执行多个测试用例的,步骤中设置环境和清除环境的目的是保证这个测试用例能够在正确的环境下被执行并且该测试用例执行完毕不能够对其他测试用例的执行带来影响。我们试想一下如果这个程序在这个测试执行的时候发生了意外的中断,没有进行清除环境的操作,这样势必会带来下一个程序的执行。比如在上面这个案例清除环境为点击图一的【清除】按钮,清除系统数据库的数据。如果测试程序在图二成功注册了一个用户,在点击【注册】按钮的时候出现了错误,这样下一个程序用同样的用户名进行注册的时候就会出错,所以要在测试程序中也加入点击图一的【清除】按钮,清除系统数据库的数据操作。这样有同学就会问如果这样为什么还要最后清除操作呢,我们让所有的清除操作都发在设置环境中进行操作就可以了,答案是我们的自动化测试程序要保证在测试完毕交付后的环境是干净的,可以让下一个使用这个环境的同学正常使用,每一个程序都可能是最后一个程序,所以在最后就必须删除。

下面是一段对于案例使用Appium技术和unittest框架的测试代码:

#!/usr/bin/env python
#coding=utf-8
import unittest
from appium.webdriver.common.touch_action import TouchAction
from appium import webdriver
class demo4test(unittest.TestCase):
def setUp(self):
self.desired_caps = {}
self.desired_caps['platformName'] = 'Android'
self.desired_caps['platformVersion'] = '6.0'
self.desired_caps['deviceName'] = 'Android Emulator'
self.desired_caps['appPackage'] = 'com.example.demo4'
self.desired_caps['appActivity'] = '.MainActivity'
self.driver = webdriver.Remote('http://localhost:4723/wd/hub', self.desired_caps)
self.driver.find_element_by_id("com.example.demo4:id/button3").click()
def test_APP(self):
self.username = "Jerry"
self.password = "123456"
self.driver.find_element_by_id("com.example.demo4:id/button2").click()
self.driver.find_element_by_id("com.example.demo4:id/username1").send_keys("")
self.driver.find_element_by_id("com.example.demo4:id/username1").send_keys(self.username)
self.driver.find_element_by_id("com.example.demo4:id/password1").send_keys("")
self.driver.find_element_by_id("com.example.demo4:id/password1").send_keys(self.password)
self.driver.find_element_by_id("com.example.demo4:id/button11").click()
self.driver.find_element_by_id("com.example.demo4:id/username").send_keys("")
self.driver.find_element_by_id("com.example.demo4:id/username").send_keys(self.username)
self.driver.find_element_by_id("com.example.demo4:id/password").send_keys("")
self.driver.find_element_by_id("com.example.demo4:id/password").send_keys(self.password)
self.driver.find_element_by_id("com.example.demo4:id/button1").click()
self.acut_result = self.driver.find_element_by_id("com.example.demo4:id/welcomeinfo").text
self.assertEqual(self.acut_result,"Welcome "+self.username)
def tearDown(self):
if (not (self.driver.find_element_by_id("com.example.demo4:id/logout"))):
self.driver.find_element_by_id("com.example.demo4:id/logout").click()                   
self.driver.find_element_by_id("com.example.demo4:id/button3").click()
self.driver.quit()
if __name__=='__main__':
#构造测试集
suite=unittest.TestSuite()
suite.addTest(demo4test("test_APP"))
#运行测试集合
runner=unittest.TextTestRunner()
runner.run(suite)

在这个代码中def setUp(self)为初始化环境,这里结尾代码"self.driver.find_element_by_id("com.example.demo4:id/button3").click()"为点击图一的【清除】键;def test_APP(self):为执行测试部分;def tearDown(self):为清除环境部分。

2)接下来我们介绍一下自动化测试的三大小步骤为:获取对象、操作对象和断言。

在上述代码中self.driver.find_element_by_id("XXX")为获取对象(我发现,不管是利用Appium还是利用UIAutomation或Robertium都可以使用by_id来实现原生态APP控件的定位)、.click(),.send_keys(self.username)等为进行操作、self.assertEqual(self.acut_result,"Welcome "+self.username)为断言。

3)最后我们来介绍一下接口自动化测试的接口自动化测试的四大小步骤为:组织协议包、发送协议包、接受协议包和分析协议包。

这里我们以测试一个基于WEB的登录程序为例。

#!/usr/bin/env python
#coding:utf-8
import unittest,requests
class CheckUserUnit(unittest.TestCase):
def setUp(self):
self.correctusername="jerry"
self.correctpassword="123456"
self.discorrectusername="tom"
self.discorrectpassword="000000"
self.url="http://localhost:8080/sec/20/jsp/index.jsp"
#错误的用户名,正确的密码
def test_login_eucp(self):
payload={"name": self.discorrectusername,"password": self.correctpassword}
data = requests.post(self.url,data=payload)
self.assertEqual("200",str(data.status_code))
self.assertIn("登录</a>失败",str(data.text))
#正确的用户名,错误的密码
def test_login_cuep(self):
payload={"name": self.correctusername,"password": self.discorrectpassword}
data = requests.post(self.url,data=payload)
self.assertEqual("200",str(data.status_code))
self.assertIn("登录</a>失败",str(data.text))
#错误的用户名,错误的密码
def test_login_euep(self):
payload={"name":self.discorrectusername,"password":self.discorrectpassword}
data = requests.post(self.url,data=payload)
self.assertEqual("200",str(data.status_code))
self.assertIn("登录</a>失败",str(data.text))
#正确的用户名,正确的密码
def test_login_cucp(self):
payload={"name": self.correctusername,"password":self.correctpassword}
data = requests.post(self.url,data=payload)
self.assertEqual("200",str(data.status_code))
self.assertIn("登录成功",str(data.text))
if __name__=='__main__':
#构造测试集
suite=unittest.TestSuite()
suite.addTest(CheckUserUnit("test_login_eucp"))
suite.addTest(CheckUserUnit("test_login_cuep"))
suite.addTest(CheckUserUnit("test_login_euep"))
suite.addTest(CheckUserUnit("test_login_cucp"))
#运行测试集合
runner=unittest.TextTestRunner()
runner.run(suite)

同样在这里def setUp(self)为初始化环境;def test_XXX(self):为执行测试部分;def tearDown(self):为清除环境部分。我们以"正确的用户名,正确的密码"的代码为例进行介绍。

"payload={"name": self.correctusername,"password":self.correctpassword}"为组织协议包;
"data = requests.post(self.url,data=payload)"为发送协议包和接受协议包
"self.assertEqual("200",str(data.status_code))"和"self.assertIn("登录成功",str(data.text)) "为分析协议包"


版权声明:本文出自51Testing会员投稿,51Testing软件测试网及相关内容提供者拥有内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   诺基亚今日推出新款 150 功能机,到手价 229 元。  诺基亚 150 手机搭载 2.4 英寸屏幕,九宫格键盘,后置 9 级独立外放扬声器;支持长按“#”键快速静音,可设置亲情号码一键呼叫。  该款新机内置 1450mAh 电池,支持 32GB 存储卡容量扩展;内置 FM 收音机,支持扬声器播放,也可连接 3.5mm 耳机收听;后置闪光灯,可长按方向“上”键开启。  外观方面,诺基亚 150 手机有红色、蓝色和黑色三种配色可选,外壳采用聚碳酸酯材质,据官方介绍整机可十年无污染,不褪色、更耐摔耐用。  该款诺基亚 150 手机仅支持移动 2G 网络,不支持联通和电信网络。目前诺基亚 15...
            0 0 828
            分享
          •   新浪科技讯据报道,谷歌(105.22,-3.58,-3.29%)母公司Alphabet今日要求法庭驳回多家广告商最新提交的修改后的集体诉讼。  2021年,多家广告商对谷歌提起集体诉讼,指控谷歌滥用其在数字广告上的主导地位。后来,加州圣荷地方法院法官贝斯·拉布森·弗里曼(BethLabsonFreeman)驳回了该诉讼。  但同时,弗里曼也保留了原告再次提起诉讼的机会。弗里曼称,原告需要厘清他们认为谷歌独占了哪个市场;还需要进一步解释,为什么说谷歌拒绝支持竞争对手的广告系统是反竞争行为,因反垄断法并未规定垄断方协助竞争对手生存。  对于广告商提交的修改后的集体诉讼,Alphabet称,提起...
            0 0 959
            分享
          • 接口测试经常遇到的bug和问题,如下:传入参数处理不当,导致程序crash;类型溢出,导致数据读出和写入不一致;因对象权限未进行校验,可以访问其他用户敏感信息;---权限校验很重要状态处理不当,导致逻辑出现错乱;逻辑校验不完善,可利用漏洞获取非正当利益等。输入值的校验:特殊值处理不当导致程序异常退出;类型边界溢出取值范围外值未返回正确的错误信息等约束条件判断要充足判断后,状态转化要测试正确顺序执行是否能被打断或者乱序输出结果的校验:错误前端处理不足,导致前端异常;错误提示处理不当,导致用户看到晦涩的错误码;错误提示不当,导致用户不知道哪里出了问题,如何解决。未进行超时处理,导致整个流程阻塞超时...
            0 1 1965
            分享
          •   顺丰集团宣布,顺丰国际与亚马逊海外购联合推出全新直邮服务,“为跨境电商和国际贸易的客户提供更加高效和便捷的物流服务”。  官方介绍称,全新的端到端顺丰国际直邮解决方案不仅可以提供更快速的国际物流服务,简化清关流程,还可实现更透明的全链路物流追踪。此次合作将大大缩短货物从美国到中国的运输时间(具体时间未说明),确保更多来自亚马逊全球运营中心的优质海外商品由顺丰在短时间内送达中国消费者手中。  亚马逊中国副总裁、亚马逊海外购中国及亚马逊新加坡电商负责人李岩川表示:  此次与顺丰国际合作推出的跨境直邮服务,是亚马逊海外购提升跨境物流体验的新一步。通过本次合作,亚马逊海外购将继续为中国消费者提供更...
            0 0 508
            分享
          •   及时同步信息  在工作中,出现问题时应及时跟进并向关键人员同步进展。但实际工作中,比较常见的是问题出现后,你跟进得可能很及时,但问题产生的原因、影响、进展情况等信息的同步往往比较滞后,通常是主管或项目干系人询问你,你才反馈出来。如果你存在这样的情况,那么本文就是为你准备的。  一个问题的生命周期大体包含问题出现、问题发现、问题分析,问题定位,问题解决或改进几个环节,发现问题时就应该同步,而不是问题解决或改进了再同步。对于QA来说,日常工作的信息同步有两大类场景,一类是线上问题的同步,一来是项目进展的同步。  关于线上问题的同步  发现线上问题时,应第一时间反馈给你的主管。大体上包含如下几块...
            0 0 623
            分享
      • 51testing软件测试圈微信