unittest框架
unittest框架是黑盒测试,主要做UI界面层的功能测试的框架,而java Junit单元测试框架,是白盒测试
利用单元测试框架,创建一个类,该类继承unittest 的TestCase,这样可以把每个case看成是一个最小的单元,由测试容器组织起来,到时候直接执行,同时引入测试报告。
测试固件:
测试固件是的两个方法? SetUp():SetUp方法进行测试前初始化 TearDown():UI功能测试后的清理工作
测试用例TestCase:
必须以 test_开头 在unitteat框架可以写多个测试用例,只要是test_开头
测试用例的执行顺序
测试用例的默认顺序:0 ~ 9,A ~ Z,a ~ z 忽略测试用例的执行:@unittest.skip(“skipping”),在要忽略执行的测试用例前面加上这句
测试套件TestSuite:
测试套件:把不同脚本中的测试用例组织起来,一起执行。 在unittest中是用TestSuite 类来表示的。
完整的单元测试很少只执行一个测试用例,开发人员通常都需要编写多个测试用例才能对某一软件功能进行比较完整的测试,这些相关的测试用例称为一个测试用例集,
addTest:把测试脚本一个一个添加进来 **makeSuite和TestLoader **:都是 把整个测试脚本中的所有测试方法都添加到测试套件中 discover:把一个文件夹下,以某种格式命名的所有脚本里面的全部测试方法都添加到测试套件中
unittest断言
断言判断实际结果和预期结果是否一致。用来检验测试是否满足预期结果。
常用的断言:
序号 | 断言方法 | 断言描述 |
---|
1 | assertEqual(arg1, arg2, msg=None) | 验证arg1=arg2,不等则fail | 2 | assertNotEqual(arg1, arg2, msg=None) | 验证arg1 != arg2, 相等则fail | 3 | assertTrue(expr, msg=None) | 验证expr是true,如果为false,则fail | 4 | assertFalse(expr,msg=None) | 验证expr是false,如果为true,则fail | 5 | assertIs(arg1, arg2, msg=None) | 验证arg1、arg2是同一个对象,不是则fail | 6 | assertIsNot(arg1, arg2, msg=None) | 验证arg1、arg2不是同一个对象,是则fail | 7 | assertIsNone(expr, msg=None) | 验证expr是None,不是则fail | 8 | assertIsNotNone(expr, msg=None) | 验证expr不是None,是则fail | 9 | assertIn(arg1, arg2, msg=None) | 验证arg1是arg2的子串,不是则fail | 10 | assertNotIn(arg1, arg2, msg=None) | 验证arg1不是arg2的子串,是则fail | 11 | assertIsInstance(obj, cls, msg=None) | 验证obj是cls的实例,不是则fail | 12 | assertNotIsInstance(obj, cls, msg=None) | 验证obj不是cls的实例,是则fail |
selenium添加断言,鼠标右键点击selenium IDE,assert
HTMLReport:测试报告
生成测试报告的步骤: 1.解决测试报告存放的位置 2.解决测试报告命名问题:时间命名 3.生成测试报告
比如测试baidu1.py,下面给出baidu1.py的代码:
from selenium import webdriver
import unittest
import time
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
class Baidu1(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.url = "https://www.baidu.com/"
self.driver.maximize_window()
time.sleep(3)
def tearDown(self):
self.driver.quit()
def test_hao(self):
driver = self.driver
driver.get(self.url)
driver.find_element_by_link_text("hao123").click()
time.sleep(6)
def test_baidusearch(self):
driver = self.driver
driver.get(self.url)
driver.find_element_by_id("kw").send_keys("易烊千玺")
driver.find_element_by_id("su").click()
time.sleep(3)
if __name__ == "__main__":
unittest.main(verbosity=1)
下面是生成测试报告的代码:HTMLRunner.py
import unittest
import os, sys
import time
import HTMLTestRunner
def createsuite():
discovers = unittest.defaultTestLoader.discover('../src20210702', pattern='testbaidu*.py', top_level_dir=None)
print(discovers)
return discovers
if __name__ == "__main__":
curpath = sys.path[0]
print(sys.path)
print(sys.path[0])
if not os.path.exists(curpath + '/resultreport'):
os.makedirs(curpath + '/resultreport')
now = time.strftime("%Y-%m-%d-%H %M %S", time.localtime(time.time()))
print(time.time())
print(time.localtime(time.time()))
filename = curpath + '/resultreport/' + now + 'resultreport.html'
with open(filename, 'wb') as fp:
runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u'测试报告', description=u'用例执行情况', verbosity=2)
suite = createsuite()
runner.run(suite)
运行程序,会有HTML报告生成,然后右击报告,Open in Browser,用浏览器打开
异常捕捉 和 错误截图
用例不可能每一次运行都成功,肯定运行时候有不成功的时候。如果可以捕捉到错误,并且把错误截图保存,这将 是一个非常棒的功能,也会给我们错误定位带来方便。 例如编写一个函数,关键语句为driver.get_screenshot_as_file:
def savescreenshot(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(1)
比如testscreenshot.py:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re
import os
class Baidu1(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
self.driver.implicitly_wait(30)
self.base_url = "http://www.baidu.com/"
self.verificationErrors = []
self.accept_next_alert = True
def test_hao(self):
driver = self.driver
driver.get(self.base_url + "/")
driver.find_element_by_link_text("hao123").click()
time.sleep(2)
try:
self.assertEqual(u'hao_上网从这里开始', driver.title)
except:
self.savescreenshot(driver,'hao.png')
def is_element_present(self, how, what):
try: self.driver.find_element(by=how, value=what)
except NoSuchElementException as e: return False
return True
def is_alert_present(self):
try: self.driver.switch_to.alert()
except NoAlertPresentException as e: return False
return True
def close_alert_and_get_its_text(self):
try:
alert = self.driver.switch_to.alert()
alert_text = alert.text
if self.accept_next_alert:
alert.accept()
else:
alert.dismiss()
return alert_text
finally: self.accept_next_alert = True
def tearDown(self):
self.driver.quit()
self.assertEqual([], self.verificationErrors)
def savescreenshot(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()))
print(time.time())
print(time.localtime(time.time()))
print(now)
driver.get_screenshot_as_file('./image/'+now+'-'+file_name)
time.sleep(3)
if __name__ == "__main__":
unittest.main()
ddt数据驱动
需要测试多组数据 目录下建data文件夹,建文件(用execl(最好用TXT文件)另存为csv
增加ddt数据 #@data(‘selenium’,u’测试中文’,‘9999999999’) #@data(2,3,4)
#单变更时不使用@unpack #@data([3, 2], [4, 3], [5, 3]) @data(*getCsv(‘test_baidu_data.csv’)) #使用file_data需要在cmd窗口下运行,否则找不到文件 #@file_data(‘test_data_list.json’) @unpack
|