【沒有所謂的運氣🍬,只有絕對的努力?】
目錄
今日目標:
1、UnitTest框架
2、UnitTest 核心用例
2.1 TestCase?
2.2 TestSuite
2.3 TestRunner?
2.4 TestLoader
2.5 TestLoader 與 TestSuite的區別
2.6?Fixture?
3、斷言
3.1 12306自動化登錄——斷言案例
3.2 斷言擴展
4、參數化
?5、小結
6、unitTest 跳過方法
7、生成測試報告
8、with open 和 open的區別
今日目標:
1、UnitTest框架
2、UnitTest 核心用例
2.1 TestCase?
import unittestdef addFn(x,y):return x + yclass Test01(unittest.TestCase):# 用例 必須以 test_ 開頭def test_method01(self):self.assertEqual(addFn(1,2),3)if __name__ == '__main__':unittest.main(verbosity=2)
2.2 TestSuite
import unittest
from unitTest.test_01_testcase import Test01# 定義測試套件
suite = unittest.TestSuite()
# 方法1: 往測試套件里面添加內容
# suite.addTest(Test01('test_method02'))# 方法2: 使用makeSuite 下面的所有以test_開頭的測試用例。
suite.addTest(unittest.makeSuite(Test01))# 執行測試套件
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
2.3 TestRunner?
2.4 TestLoader
import unittestsuite = unittest.defaultTestLoader.discover('./case') # 默認是以 test*.py 的文件runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
2.5 TestLoader 與 TestSuite的區別
2.6?Fixture?
import unittestdef setUpModule():print('模塊級別----開始')def tearDownModule():print('模塊級別----結束')class TestCase(unittest.TestCase):@classmethoddef setUpClass(cls) -> None:print("類級別========開始")@classmethoddef tearDownClass(cls) -> None:print("類級別========結束")def setUp(self) -> None:print('------方法級別---開始------')def tearDown(self) -> None:print('-----方法級別--- 結束-')def test_method01(self):print('方法01')def test_method02(self):print('方法02')if __name__ == '__main__':unittest.main(verbosity=2)
3、斷言
3.1 12306自動化登錄——斷言案例
需求:使用unitTest 框架對 12306 網頁登錄頁面進行測試。
(1)進入頁面?https://www.12306.cn/index/,點擊右上角的 “登錄”,進入登錄頁面。
(2)輸入用戶名,不輸入密碼,點擊”立即登錄“按鈕。
(3)獲取錯誤提示信息
(4)斷言錯誤提示信息是否為”請輸入密碼!“,如果斷言失敗,則保存截圖。
import unittestfrom selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import Byfrom time import sleepclass TestLogin12306(unittest.TestCase):def setUp(self) -> None:# 設置正確的驅動路徑service = ChromeService(executable_path="/usr/local/bin/chromedriver")options = webdriver.ChromeOptions()driver = webdriver.Chrome(service=service, options=options)self.driver = driver# 1、進入12306網站首頁driver.get('https://www.12306.cn/index/')sleep(2)# 最大化瀏覽器driver.maximize_window()# 隱式等待driver.implicitly_wait(30)# 2、點擊右上角的登錄按鈕current_handle = driver.current_window_handle # 獲取當前頁面窗口driver.find_element(By.ID, "J-btn-login").click()sleep(2)# 3、進入登錄頁面 新窗口# 獲取所有打開頁面窗口handles = driver.window_handlesfor h in handles:if h != current_handle:driver.switch_to.window(h) # 切換窗口# 刷新頁面driver.refresh()sleep(2)def tearDown(self) -> None:sleep(2)self.driver.quit()def test_login_usernam_not_password(self):driver = self.driver# 4、輸入用戶名 adminself.driver.find_element(By.ID, 'J-userName').send_keys("admin")sleep(2)# 5、點擊 "立即登錄"按鈕driver.find_element(By.ID, 'J-login').click()sleep(2)# 6、獲取錯誤提示信息error_msg = driver.find_element(By.CSS_SELECTOR, '#J-login-error span').textsleep(2)expect_result = "請輸入密碼!"try:self.assertEqual(error_msg, expect_result)except AssertionError:# 截圖driver.save_screenshot("./image/error_.png")# if __name__ == '__main__':
# unittest.main(verbosity=2)
(自動化運行結果)
(自動化運行過程中,斷言出錯,自動保存的圖片)
3.2 斷言擴展
4、參數化
import unittestfrom parameterized import parameterizeddef get_data():return [(1, 2, 3), (3, 0, 3)]class TestCase(unittest.TestCase):# 方法1:# @parameterized.expand([(1, 2, 3), (3, 0, 3)])# def test_add(self, a, b, result):# self.assertEqual(a + b, result)# 方法2:# data = [(1, 2, 3), (3, 0, 3)]# @parameterized.expand(data)# def test_add(self, a, b, result):# self.assertEqual(a + b, result)# 方法3: get_data() 在 Class的外面。@parameterized.expand(get_data())def test_add(self, a, b, result):self.assertEqual(a + b, result)
?5、小結
6、unitTest 跳過方法
import unittestversion = 30
class TestCase(unittest.TestCase):@unittest.skipdef test_method01(self):# 功能未完成print("test01")passdef test_method02(self):print("test01")@unittest.skipIf(version >= 30,"版本大于30的,就跳過")def test_method02(self):print("test01")
7、生成測試報告
import time
import unittest
from test_08_skip import TestCase
from tools.HTMLTestRunner import HTMLTestRunner# suite = unittest.TestSuite()
# suite.addTest(TestCase('test_method02'))
suite = unittest.defaultTestLoader.discover('./', pattern="test_01*.py")# 自帶寫入 .txt文件
# with open("./report/reporter.txt",'w',encoding='utf-8') as f:
# unittest.TextTestRunner(verbosity=2,stream=f, descriptions=True).run(suite)# 使用tools/HTMLTestRunner 寫入.html文件
file_name = "./report/reporter{}.html".format(time.strftime("%y_%m_%d %H_%M_%S"))
with open(file_name, "wb") as f: # 生成html報告,必須使用 wbHTMLTestRunner(stream=f, verbosity=2, title="xxx項目自動化測試報告").run(suite)
(測試用例的報告結果展示)
8、with open 和 open的區別
今天寫了個小的案例,Selenium + UnitTest 。完成12306的登錄頁面的 斷言測試,還是很滿足的。晚上繼續學習。