前面講了系列開學了selenium文章,大家可以仔細閱讀,相信會有一定的識訓,如若有問題歡迎私我qing_an_an,
簡介
unittest是Python單元測驗框架,類似于JUnit框架
什么是單元測驗?
單元測驗是指,對軟體中的最小可測驗單元在與程式其他部分相隔離的情況下進行檢查和驗證 的作業,這里的最小可測驗單元通常是指函式或者類,一般是開發來做的,按照測驗階段來分, 就是單元測驗、集成測驗、系統測驗以及驗收測驗,
為什么要做單元測驗?
1. 靈活的組織ui自動化/介面測驗用例
2. 讓用例高效的執行
3. 斷言:方便驗證測驗用例的結果
4. 集成html形式測驗報告
unittest中測驗用例方法都是以test開頭的,否則不被unittest識別,執行順序根據(0-9,A-Z,a-z),如:test01,testaa,
舉例
1. 匯入unittest模塊
2. 創建一個測驗類,并繼承unittest.TestCase()
3. 定義測驗方法,方法名必須以test_開頭
4. 呼叫unittest.main()方法來運行測驗用例,unittest.main()方法會搜索該模塊下所有以test開頭的測 試用例方法,并自動執行
5. 每一個用例執行的結果的標識,OK OR FALSE
from selenium import webdriver
def login():
fox = webdriver.Firefox()
fox.implicitly_wait(5)
fox.get('https://baidu.com')
if_rame = fox.find_elements_by_tag_name('iframe')[0]
fox.switch_to.frame(if_rame)
fox.find_element_by_id('switcher_plogin').click()
fox.find_element_by_id('u').send_keys('123456')
fox.find_element_by_id('p').send_keys('123456')
fox.find_element_by_id('login_button').click()
這是一個QQ空間的例子,上述是寫在自定義的函式里面,那我們寫入到unittest中,上面的這個例子需要稍微的改變一下login.py:
from selenium import webdriver
import unittest
class LoginTest(unittest.TestCase):
def test_login():
fox = webdriver.Firefox()
fox.implicitly_wait(5)
fox.get('https://qzone.qq.com/')
if_rame = fox.find_elements_by_tag_name('iframe')[0]
fox.switch_to.frame(if_rame)
fox.find_element_by_id('switcher_plogin').click()
fox.find_element_by_id('u').send_keys("清安")
fox.find_element_by_id('p').send_keys("請安安")
fox.find_element_by_id('login_button').click()
if __name__=='__main__':
unittest.main()
我們來看看unittest的前置與后置是怎么樣的,
from Login import T_test
import unittest
from selenium import webdriver
class LoginTest(unittest.TestCase,T_test):
def setUp(self) -> None: # 測驗完一個用例關閉一次瀏覽器,再繼續第二個用例
self.fox = webdriver.Firefox()
self.fox.implicitly_wait(5)
print("用例執行開始")
print("每執行一個用例都需要執行一次")
def tearDown(self) -> None:
self.fox.quit()
print("用例執行結束")
@classmethod
def setUpClass(cls): # 全域執行一次
print("這是所有test的前置條件"+'\n')
@classmethod
def tearDownClass(cls): # 全域執行一次
print("這是所有test的后置條件"+'\n')
# 測驗資料
def test_login_01(self):
fox = webdriver.Firefox()
fox.implicitly_wait(5)
fox.get('https://qzone.qq.com/')
if_rame = fox.find_elements_by_tag_name('iframe')[0]
fox.switch_to.frame(if_rame)
fox.find_element_by_id('switcher_plogin').click()
fox.find_element_by_id('u').send_keys("清安")
fox.find_element_by_id('p').send_keys("請安安")
fox.find_element_by_id('login_button').click()
def test_login_02(self):
def test_login_01():
fox = webdriver.Firefox()
fox.implicitly_wait(5)
fox.get('https://qzone.qq.com/')
if_rame = fox.find_elements_by_tag_name('iframe')[0]
fox.switch_to.frame(if_rame)
fox.find_element_by_id('switcher_plogin').click()
fox.find_element_by_id('u').send_keys("清安")
fox.find_element_by_id('p').send_keys("請安安")
fox.find_element_by_id('login_button').click()
if __name__=='__main__':
unittest.main()
這里的前置后置則一就好,不同情況選不同的前置后置,上述是兩種前置后置,不是每次寫unittest兩種都需要添加進去,
測驗集
1. 創建測驗集:suite=unittest.TestSuite()
2. 測驗集中添加指定的測驗用例:
方式一:添加單個測驗用例方法
addTest(類名(方法名)):
方式二:添加多個測驗用例方法,方法名存在一個串列
addTest([類名(方法名1),類名(方法名2)....]):
方式三:添加所有測驗用例
unittest.TestLoader()
loadTestsFromTestCase(測驗類名):添加一個測驗類
loadTestsFromModule(模塊名):添加一個模塊
3. 執行測驗集
1. 創建執行器:runner= unittest.TextTestRunner() 或者 runner=HTMLTestRunner
2. 執行測驗集:runner.run(suite)
先看第一種:這里就不貼全部代碼了,代碼跟上述一致,只是改了這里,寫在unittest_login.py:
if __name__=='__main__':
# 創建一個測驗套件
suite = unittest.TestSuite()
# 寫入所需執行的測驗用例
case1 = LoginTest('test01')
# 添加到組件中
suite.addTest(case1)
# 執行測驗用例
running = unittest.TextTestRunner()
running.run(suite)
再來看第二種:
if __name__=='__main__':
# 創建一個測驗套件
suite = unittest.TestSuite()
# 添加LoginTest下所有的測驗方法
loa = unittest.TestLoader()
suite.addTest(loa.loadTestsFromTestCase(LoginTest))
# 執行測驗用例
running = unittest.TextTestRunner()
running.run(suite)
unittest的斷言
斷言很多種,這里就不一一介紹了,后續若是可以,全部搬出來介紹一遍,這里舉一個例子,大家要學會舉一反三:

這里就拿assertEqual舉例,判斷是a==b,那么我們可以用來干嘛呢,判斷標題是否準確,或者判斷跳轉頁面的某個元素的值是否有你想要的值:
那上述代碼中的test01舉例:
def test01(self):
self.login('https://qzone.qq.com/','123456','123465')
self.ele = self.fox.find_element_by_id('title_2').text
self.assertEqual(self.ele, '賬號密碼登錄')
或者獲取網頁的標題做一個斷言,并且自定義斷言資訊:
def test01(self):
self.login('https://qzone.qq.com/','123456','123465')
self.ele = self.fox.title
self.assertEqual(self.ele, 'QQ空間-分享生活,留住感',msg='不符合')
我判斷元素的文本值是否相等,可見我文字打錯了得到的結果


生成HTML測驗報告
最后我們來生成一份報告看看,雖然資料不多,耐用就好:
引數:
1. 報告verbosity引數可以控制執行結果的輸出,0 是簡單報告、1 是一般報告、2 是詳細報告 2. 報告stream引數可以將報告輸出到檔案:可以用HTMLTestRunner輸出html報告
if __name__=='__main__':
# 創建一個測驗套件
suite = unittest.TestSuite()
# 添加LoginTest下所有的測驗方法
loa = unittest.TestLoader()
suite.addTest(loa.loadTestsFromTestCase(LoginTest))
# 執行測驗用例
running = unittest.TextTestRunner(verbosity=2)
running.run(suite)
輸出HTML報告,需要匯入一個包:
1. 導包: from HTMLTestRunner import HTMLTestRunner
2. 創建執行器 :runner=HTMLTestRunner(stream,tester,description,title)
引數:stream--報告檔案;tester--測驗人員,description-報告描述資訊,title-報告標題
import HTMLTestRunner
import unittest
from uni_test import LoginTest
if __name__=='__main__':
# 創建一個測驗套件
suite = unittest.TestSuite()
# 添加LoginTest下所有的測驗方法
loa = unittest.TestLoader()
suite.addTest(loa.loadTestsFromTestCase(LoginTest))
# 執行測驗用例
running = HTMLTestRunner.HTMLTestRunner(stream=open('123.html', 'wb'),
tester='清歡無別事',
description='簡單的報告',
title='測驗test')
running.run(suite)
這里注意了,這一部分代碼需要單獨寫出來,也就是說需要創建一個use_unittest.py檔案用于執行前面的操作,不能寫在test測驗用例下面哦,否則不能輸出報告,據博主所知,unittest中即使不寫這部分代碼也能跑起來,python只執行unittest中的內容,無管這一部分,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/306288.html
標籤:其他
上一篇:【演算法入門08】青蛙跳臺階
