本文所用到的案例:
图一为登录首页,当输入用户名和密码后,点击【登录】按钮,如果用户名密码正确进入图三登录成功页面,否则弹出错误消息;点击【进行注册】按钮进入图二进行注册;点击【清除】按钮,清除数据库中的所有数据,这个按钮是为测试而临时设置的,正式产品中将会取消。
图二为注册页,当输入用户名和密码后,点击【注册】按钮,当输入的用户名在数据库中不存在,注册成功,返回图一的登录页面,否则弹出错误消息。
图三为登录成功页,当在图一中输入正确的用户名和密码后,进入这个页面,这里的"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软件测试网及相关内容提供者拥有内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。