1. 程式人生 > 其它 >UnitTest測試框架全棧詳解

UnitTest測試框架全棧詳解

主要的測試維度:

1、表單的錯誤提示資訊驗證

2、產品的業務邏輯

3、頁面的互動

單元測試

端元測試時最基本也是最底層的策劃型別,單元測試應用於最基本的程式碼軟體,在python中,單元測試框架主要是unit test

unittest始於標準庫,安裝了python直譯器後就可以直接匯入使用了

 

 

 

一個完整的自動化測試用例的組成:

1、初始化

2、測試步驟

3、斷言

4、清理

 

如以百度搜索“趙麗穎”為例:

(1)初始化就是開啟瀏覽器,進入百度;

(2)測試步驟:就是你輸入關鍵字“馬雲”然後搜尋到相關內容的過程;

(3)斷言:就是斷言我們搜尋到的內容與輸入的關鍵字的比較("is"、"in"、"=="),斷言的方式:

A、python原生的assert斷言方法;

B、selenium原生的斷言方法:

a.saaertEqual:比較兩個物件是否相等;

b.assertIN:比較一個物件是否包含另一個物件;

c.assertTrue:針對bool型別驗證true or false;真真為真,真假為假,即斷言內容返回真,則為真,斷言內容返回假則為假。

d.assertFalse:針對bool型別驗證true or false;假假為真,假真為假,即斷言內容返回假,則為真,斷言內容返回真則為假。

(4)清理:關閉瀏覽器的過程。

 

 測試套件:

TestSuite:在一個測試套件裡面可以包含很多的測試用例,可以把它理解為一個容器

它可以分為兩個類目:

1、按測試類來執行測試用例

 

 

  

import unittest
from selenium import webdriver
import time

class SinaTest(unittest.TestCase):
	def setUp(self) -> None:
		self.driver=webdriver.Chrome()
		self.driver.maximize_window()
		self.driver.get('https://mail.sina.com.cn/#')
		self.driver.implicitly_wait(30)


	def tearDown(self) -> None:
		self.driver.quit()

	def test_login_nulll(self):
		# 驗證賬戶密碼為空的提示資訊
		self.driver.find_element_by_id('freename').send_keys('')
		self.driver.find_element_by_id('freepassword').send_keys('')
		self.driver.find_element_by_class_name('loginBtn').click()
		divtest=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
		time.sleep(3)
		self.assertEqual(divtest.text,'請輸入郵箱名')

	def test_login_emal_format(self):
		# 驗證賬戶格式不規範的提示資訊
		self.driver.find_element_by_id('freename').send_keys('afafafaf')
		self.driver.find_element_by_id('freepassword').send_keys('dasda')
		self.driver.find_element_by_class_name('loginBtn').click()
		divtest=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
		# 比較兩個物件是否相等
		time.sleep(3)
		self.assertEqual(divtest.text,'您輸入的郵箱名格式不正確')


	def test_login_isButton(self):
	# 	驗證自動登入是否預設勾選
		divTest=self.driver.find_element_by_id('store1')
		divTest.click()
		# 針對布林型別驗證assertTure
		self.assertFalse(divTest.is_selected())

	if __name__=='__main__':
		# 按測試類來執行
		# seite=unittest.TestLoader().loadTestsFromTestCase('SinaTest')

2、按照測試模組來執行測試用例

 

 

 

import unittest
from selenium import webdriver
import time

class SinaTest(unittest.TestCase):
	def setUp(self) -> None:
		self.driver=webdriver.Chrome()
		self.driver.maximize_window()
		self.driver.get('https://mail.sina.com.cn/#')
		self.driver.implicitly_wait(30)


	def tearDown(self) -> None:
		self.driver.quit()

	def test_login_nulll(self):
		# 驗證賬戶密碼為空的提示資訊
		self.driver.find_element_by_id('freename').send_keys('')
		self.driver.find_element_by_id('freepassword').send_keys('')
		self.driver.find_element_by_class_name('loginBtn').click()
		divtest=self.driver.find_element_by_xpath
('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]') time.sleep(3) self.assertEqual(divtest.text,'請輸入郵箱名') def test_login_emal_format(self): # 驗證賬戶格式不規範的提示資訊 self.driver.find_element_by_id('freename').send_keys('afafafaf') self.driver.find_element_by_id('freepassword').send_keys('dasda') self.driver.find_element_by_class_name('loginBtn').click() divtest=self.driver.find_element_by_xpath
('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]') # 比較兩個物件是否相等 time.sleep(3) self.assertEqual(divtest.text,'您輸入的郵箱名格式不正確') def test_login_isButton(self): # 驗證自動登入是否預設勾選 divTest=self.driver.find_element_by_id('store1') divTest.click() # 針對布林型別驗證assertTure self.assertFalse(divTest.is_selected()) if __name__=='__main__': # 按測試模組來執行 seite=unittest.TestLoader().loadTestsFromTestCase('SinaTest') unittest.TextTestRunner().run(seite)

 測試韌體:

測試韌體:初始化setUp(),清理tearDown()

類測試韌體:指的是不管一個測試類裡面有多少個測試用例,測試韌體只執行一次

缺點是執行完一個測試用例後,需要回歸到頁面的初始化

測試執行:

TestRunner:測試執行指的是針對測試套件或者是測試用例進行執行的過程

測試報告:

TestReport:所有的測試測試用例執行完成後輸出的彙總結果報告資訊

注意:在測試類裡面編寫測試方法必須時test開頭的

練習一、

 

 

 練習二斷言

常用的斷言有:

1、比較兩個物件是否相等:assertEqual()

2、比較一個物件是否包含另一個物件:assertIn

3、比較兩個物件是否為真:asserTure()

4、比較兩個物件是否為假:assertFales()

比較兩個物件是否相等:assertEqual()

 

 

 比較兩個物件是否為真:asserTure()

比較兩個物件是否為假:assertFales()

 

 

 

 

 

 

 測試用例執行順序

在unittest中,測試點的執行順序是依據ascill碼來執行的,也就是說根據ASCII碼的順序載入,數字與字母的順序為:0-9,A-Z,a-z,所以以A開頭的測試用例方法會優先執行,以a開頭會後執行。也就是根據數字的大小從小到 大執行的

注意:編寫的每一個自動化測試用例都必須是獨立的,和其他的測試用例都沒有任何的依賴性

編寫測試用例注意事項

1、在一個測試類裡面,每一個測試的方法都是以test開頭的,test不能是中間或者尾部,必須是開頭,建議test_

2、每一個測試用例都應該有註釋資訊,這樣在測試報告就會顯示具體的測試點的檢查點

3、在自動化測試中,每個測試用例都必須的有斷言,五斷言的自動化測試用例是無效的

4、最好一個測試用例對應一個測試點,不要多個業務檢查點寫一個測試用例

5、如果涉及到業務邏輯的吃了,最好把業務邏輯的處理方法放在斷言前面,這樣做的目的時不要因為業務邏輯執行錯誤導斷言也失敗

6、測試用例名稱最好規範,有約束

7、是否先寫自動化測試的測試程式碼,再使用自動化測試方式寫,本人覺得沒必要,畢竟能夠做自動化測試的都具備了功能測試的劇本水平,所以沒有必要把一個業務的檢查點寫多次,浪費時間和人力成本。

自動化測試流程:

1、先梳理那些模組可以做自動化測試

2、梳理完成後,和相關的的人對下計劃以及梳理的結果

3、編寫程式碼時先梳理的測試模組

4、編寫完成後和相關人員進行程式碼評審(程式碼評審的目的是:測試場景是否考慮周全,測試斷言是否合理,程式碼編寫是否合理)

5、編寫完成後整合到jekins持續整合平臺

6、下個迭代的時候,直接可以應用於產品的迴歸測試中

引數化

1、引數化: 相同的測試步驟,不同的測試資料,那麼這樣的測試場景我們就可以使用引數化的解決思路來解決。也就是說使用一個測試用例的程式碼,執行多個測試場景。引數化需要藉助外部的parameterized的庫,安裝命令:pip3 install parameterized。

2、引數化本質:

針對測試資料進行迴圈,每次迴圈的時候對列表中的元素的值一一賦值的過程。

 

 

生成測試報告的是HTMLTestRunner

nuittest生成的測試報告需要使用到都三方的庫HTMLTestRunner,把該庫放在Python安裝目錄下的lib目錄下

 

 

 

import time
import unittest
import HTMLTestRunner
import os


def getSuite():
	# 獲取所有需要執行的測試模組
	suite=unittest.TestLoader().discover(
		start_dir=os.path.dirname(__file__),
		pattern='test_*.py')
	return suite

def getNowTime():
	return time.strftime(
		'%y-%m-%d %H_%M_%S',
		time.localtime(time.time())
	)

def main():
	filename=os.path.join(os.path.dirname(__file__),'report',getNowTime()+'report.html')
	lo=open(filename,'wb')
	runner=HTMLTestRunner.HTMLTestRunner(
		stream=lo,
		title='UI自動化測試報告',
		description='UI自動化測試報告'
	)
	runner.run(getSuite())
if __name__=='__main__':
	main()

 操作步驟

1、先建立一個名為report的資料夾

2、執行程式

3、執行完之後再report的資料夾中會有一個新的檔案(我們是以現在時間來命名的)

4、以HTML的格式開啟檔案(此時我們選擇使用chrome瀏覽器開啟)