用户注册功能
在用户注册页面,用户输入用户名,密码,昵称,图像文件(可以不上传)即可完成注册,但是如果昵称或者用户名被注册过了,就会显示账号或昵称已经存在
使用数据驱动DDT让测试数据来驱动测试用例代码执行,使用测试套件把注册成功和注册失败的测试用例组织到一起进行一个整体的测试,对注册失败的测试用例进行错误捕捉并保存异常截图,最后通过HTMLTestRunner生成HTML测试报告
注册成功
注册成功的测试用例
[ { "username": "12345", "password": "12345", "nickname": "孙悟空", "head": "D:\\photo\\18.jpg" }, { "username": "23456", "password": "23456", "nickname": "猪八戒", "head": "" }, { "username": "34567", "password": "34567", "nickname": "唐三藏", "head": "D:\\photo\\18.jpg" }, { "username": "45678", "password": "45678", "nickname": "沙和尚", "head": "D:\\photo\\16.jpg" }, { "username": "abcde", "password": "abcde", "nickname": "黑旋风", "head": "D:\\photo\\18.jpg" }, { "username": "bcdef", "password": "bcdef", "nickname": "豹子头", "head": "" }, { "username": "cdefg", "password": "cdefg", "nickname": "行者", "head": "D:\\photo\\18.jpg" } ]
注册成功的自动化测试脚本
from selenium import webdriver import time import unittest from ddt@ddt class RegisterTestOk(unittest.TestCase): # 测试固件 def setUp(self): # 获取谷歌浏览器驱动 self.driver = webdriver.Chrome() # Web聊天室链接 self.url = "http://82.157.7.147:8080/chatroom/" # 浏览器最大化 self.driver.maximize_window() time.sleep(3) def tearDown(self): # 关闭浏览器,清除缓存 self.driver.quit() # 测试用例 @file_data('./registerOkData.json') def test_RegisterOk(self, username, password, nickname, head): driver = self.driver url = self.url driver.get(url) # 点击注册 driver.find_element_by_link_text("注册").click() # 智能等待 driver.implicitly_wait(3) # 输入注册信息 driver.find_element_by_xpath('//*[@id="app"]/form/div[1]/input').send_keys(username) driver.find_element_by_xpath('//*[@id="app"]/form/div[2]/input').send_keys(password) driver.find_element_by_xpath('//*[@id="app"]/form/div[3]/input').send_keys(nickname) driver.find_element_by_xpath('//*[@id="app"]/form/div[4]/input').send_keys(head) driver.find_element_by_xpath('//*[@id="app"]/form/div[6]/input').click() time.sleep(3) # 注册成功,关闭登陆成功弹窗 driver.switch_to.alert.accept() time.sleep(3) if __name__ == '__main__': unittest.main() import ddt, unpack, data, file_data
注册失败
注册失败的测试用例
[ { "username": "12345", "password": "12345", "nickname": "孙孙孙", "head": "D:\\photo\\18.jpg" }, { "username": "22222", "password": "23456", "nickname": "猪八戒", "head": "D:\\photo\\16.jpg" }, { "username": "34567", "password": "34567", "nickname": "唐唐唐", "head": "D:\\photo\\18.jpg" }, { "username": "45678", "password": "45678", "nickname": "沙沙沙", "head": "" }, { "username": "ccccc", "password": "abcde", "nickname": "黑旋风", "head": "D:\\photo\\18.jpg" }, { "username": "bcdef", "password": "bcdef", "nickname": "豹子子", "head": "" }, { "username": "eeeee", "password": "cdefg", "nickname": "行者", "head": "D:\\photo\\16.jpg" } ]
注册失败的自动化脚本
from selenium import webdriver import time import unittest import os from ddt import ddt, unpack, data, file_data @ddt class RegisterTestFalse(unittest.TestCase): # 测试固件 def setUp(self): self.driver = webdriver.Chrome() self.url = "http://82.157.7.147:8080/chatroom/" self.driver.maximize_window() time.sleep(3) def tearDown(self): self.driver.quit() # 保存异常截图 def saveScreenAsPhoto(self, driver, file_name): if not os.path.exists("./image"): os.makedirs("./image") now = time.strftime("%Y%m%d-%H%M%S", time.localtime(time.time())) driver.get_screenshot_as_file("./image/"+now+"-"+file_name) time.sleep(2) # 测试用例 @file_data('./registerFalseData.json') def test_RegisterFalse(self, username, password, nickname, head): driver = self.driver url = self.url driver.get(url) driver.find_element_by_link_text("注册").click() driver.implicitly_wait(3) driver.find_element_by_xpath('//*[@id="app"]/form/div[1]/input').send_keys(username) driver.find_element_by_xpath('//*[@id="app"]/form/div[2]/input').send_keys(password) driver.find_element_by_xpath('//*[@id="app"]/form/div[3]/input').send_keys(nickname) driver.find_element_by_xpath('//*[@id="app"]/form/div[4]/input').send_keys(head) driver.find_element_by_xpath('//*[@id="app"]/form/div[6]/input').click() time.sleep(3) errorMessage = driver.find_element_by_xpath('//*[@id="app"]/form/div[5]').text # 异常捕捉并保存错误截图 try: self.assertFalse(errorMessage, msg="账号或密码已经存在") except: self.saveScreenAsPhoto(driver, 'false.png') time.sleep(3) if __name__ == '__main__': unittest.main()
测试套件
使用测试套件组织测试用例一起执行,并生成HTML测试报告
import HTMLTestRunner import os import sys import time import unittest from register_test import register_ok from register_test import register_false def createSuite(): suit1 = unittest.TestLoader().loadTestsFromTestCase(register_ok.RegisterTestOk) suit2 = unittest.TestLoader().loadTestsFromTestCase(register_false.RegisterTestFalse) suit = unittest.TestSuite([suit1, suit2]) return suit if __name__ == '__main__': curpath = sys.path[0] if not os.path.exists(curpath + '/registerReport'): os.makedirs(curpath + '/registerReport') now = time.strftime("%Y-%m-%d-%H %M %S", time.localtime(time.time())) fileName = curpath + '/registerReport/' + now + 'registerReport.html' with open(fileName, 'wb') as fp: runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u"测试报告", description=u"用例执行情况", verbosity=2) suit = createSuite() runner.run(suit)
HTML测试报告
因为对异常进行捕捉,并保存错误截图,所以注册失败的测试用例也是测试成功的
异常截图
用户登陆注册功能
在用户登陆页面,用户输入用户名,密码即可完成登陆,但是如果输入的用户名无效就会提示账号不存在,如果用户名正确但是密码输入错误就会提示密码错误
使用数据驱动DDT让测试数据来驱动测试用例代码执行,使用测试套件把登陆成功和登陆失败的测试用例组织到一起进行一个整体的测试,对登陆失败的测试用例进行错误捕捉并保存异常截图,最后通过HTMLTestRunner生成HTML测试报告
登陆成功
登陆成功测试用例
[ { "username": "abc", "password": "123" }, { "username": "12345", "password": "12345" }, { "username": "23456", "password": "23456" }, { "username": "34567", "password": "34567" }, { "username": "abcde", "password": "abcde" } ]
登陆成功自动化测试脚本
from selenium import webdriver import time import unittest from ddt import ddt, unpack, data, file_data @ddt class LoginTestOk(unittest.TestCase): def setUp(self): # 获取谷歌浏览器驱动 self.driver = webdriver.Chrome() # Web聊天室链接 self.url = "http://82.157.7.147:8080/chatroom/" # 浏览器最大化 self.driver.maximize_window() time.sleep(3) def tearDown(self): # 关闭浏览器,清除缓存 self.driver.quit() @file_data('./loginOkData.json') def test_LoginOk(self, username, password): driver = self.driver url = self.url driver.get(url) time.sleep(3) driver.find_element_by_xpath('//*[@id="app"]/form/div[1]/input').send_keys(username) driver.find_element_by_xpath('//*[@id="app"]/form/div[2]/input').send_keys(password) driver.find_element_by_xpath('//*[@id="app"]/form/div[4]/input').click() time.sleep(3) driver.switch_to.alert.accept() time.sleep(3) if __name__ == '__main__': unittest.main()
账号不存在,登陆失败
账号不存在,登陆失败的测试用例
[ { "username": "aaa", "password": "123" }, { "username": "bbbbb", "password": "12345" }, { "username": "65436", "password": "23456" }, { "username": "daa32", "password": "34567" }, { "username": "dd225", "password": "abcde" } ]
账号不存在,登陆失败的自动化测试脚本
import os import time import unittest from ddt import ddt, file_data from selenium import webdriver @ddt class LoginTestFalseNone(unittest.TestCase): def setUp(self): # 获取谷歌浏览器驱动 self.driver = webdriver.Chrome() # Web聊天室链接 self.url = "http://82.157.7.147:8080/chatroom/" # 浏览器最大化 self.driver.maximize_window() time.sleep(3) def tearDown(self): # 关闭浏览器,清除缓存 self.driver.quit() # 保存异常截图 def saveScreenAsPhoto(self, driver, file_name): if not os.path.exists("./image"): os.makedirs("./image") now = time.strftime("%Y%m%d-%H%M%S", time.localtime(time.time())) driver.get_screenshot_as_file("./image/" + now + "-" + file_name) time.sleep(2) @file_data('./loginFalseNone.json') def test_LoginOk(self, username, password): driver = self.driver url = self.url driver.get(url) time.sleep(3) # 输入登陆信息,点击登陆 driver.find_element_by_xpath('//*[@id="app"]/form/div[1]/input').send_keys(username) driver.find_element_by_xpath('//*[@id="app"]/form/div[2]/input').send_keys(password) driver.find_element_by_xpath('//*[@id="app"]/form/div[4]/input').click() time.sleep(3) errorMessage = driver.find_element_by_xpath('//*[@id="app"]/form/div[3]').text try: self.assertFalse(errorMessage, msg="账号不存在") except: self.saveScreenAsPhoto(driver, 'false-none.png') time.sleep(3) if __name__ == '__main__': unittest.main()
密码错误,登陆失败
密码错误,登陆失败的测试用例
[ { "username": "abc", "password": "12345" }, { "username": "12345", "password": "23456" }, { "username": "23456", "password": "34567" }, { "username": "34567", "password": "45678" }, { "username": "abcde", "password": "abcdef" } ]
密码错误,登陆失败的自动化测试脚本
import os import time import unittest from ddt import ddt, file_data from selenium import webdriver @ddt class LoginTestFalseError(unittest.TestCase): def setUp(self): # 获取谷歌浏览器驱动 self.driver = webdriver.Chrome() # Web聊天室链接 self.url = "http://82.157.7.147:8080/chatroom/" # 浏览器最大化 self.driver.maximize_window() time.sleep(3) def tearDown(self): # 关闭浏览器,清除缓存 self.driver.quit() # 保存异常时截图 def saveScreenAsPhoto(self, driver, file_name): if not os.path.exists("./image"): os.makedirs("./image") now = time.strftime("%Y%m%d-%H%M%S", time.localtime(time.time())) driver.get_screenshot_as_file("./image/" + now + "-" + file_name) time.sleep(2) @file_data('./loginFalseError.json') def test_LoginOk(self, username, password): driver = self.driver url = self.url driver.get(url) time.sleep(3) # 输入登陆信息,点击登陆 driver.find_element_by_xpath('//*[@id="app"]/form/div[1]/input').send_keys(username) driver.find_element_by_xpath('//*[@id="app"]/form/div[2]/input').send_keys(password) driver.find_element_by_xpath('//*[@id="app"]/form/div[4]/input').click() time.sleep(3) errorMessage = driver.find_element_by_xpath('//*[@id="app"]/form/div[3]').text try: self.assertFalse(errorMessage, msg="密码错误") except: self.saveScreenAsPhoto(driver, 'false-error.png') time.sleep(3) if __name__ == '__main__': unittest.main()
测试套件
使用测试套件组织测试用例一起执行,并生成HTML测试报告
from login_test import login_false_none from login_test import login_false_error def createSuite(): # 登陆成功的测试脚本 suit1 = unittest.TestLoader().loadTestsFromTestCase(login_ok.LoginTestOk) # 账号不存在的测试脚本 suit2 = unittest.TestLoader().loadTestsFromTestCase(login_false_none.LoginTestFalseNone) # 密码错误的测试脚本 suit3 = unittest.TestLoader().loadTestsFromTestCase(login_false_error.LoginTestFalseError) suit = unittest.TestSuite([suit1, suit2, suit3]) return suit if __name__ == '__main__': curpath = sys.path[0] if not os.path.exists(curpath + '/loginReport'): os.makedirs(curpath + '/loginReport') now = time.strftime("%Y-%m-%d-%H %M %S", time.localtime(time.time())) fileName = curpath + '/loginReport/' + now + 'loginReport.html' with open(fileName, 'wb') as fp: runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u"测试报告", description=u"用例执行情况", verbosity=2) suit = createSuite() runner.run(suit)
HTML测试报告
因为对异常进行捕捉,并保存错误截图,所以登陆失败的测试用例也是测试成功的
异常截图
账号不存在,捕捉保存的异常图片
密码错误,捕捉保存的异常图片