day21——web自動化測試(3)Unittest+Selenium實戰小案例

【沒有所謂的運氣🍬,只有絕對的努力?】

目錄

今日目標:

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的登錄頁面的 斷言測試,還是很滿足的。晚上繼續學習。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64238.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64238.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64238.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Flink運行時架構】系統構架

SMP架構 數據處理系統的架構最簡單的實現方式就是單節點,但是隨著數據量的增大,為了使單節點的機器性能更加強大,需要增加CPU數量和加大內存來提高吞吐量。這就是所謂的SMP(Symmetrical Multi Processing,對稱多處理)架構。 但是這種架構帶來…

CountDownLatch應用舉例

定義 CountDownLatch是juc下的一個多線程鎖,下面是jdk對它的定義 A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes. 翻譯如下 一種同步輔助工具,允許一個或多個…

ADC(二):外部觸發

有關ADC的基礎知識請參考標準庫入門教程 ADC(二):外部觸發 1、TIM1的CC1事件觸發ADC1DMA重裝載2、TIM3的TRGO事件(的更新事件)觸發ADC1DMA重裝載3、TIM3的TRGO事件(的捕獲事件)觸發ADC1DMA重裝載4、優化TIM3的TRGO事件(的捕獲事件)觸發ADC1D…

磁盤分區格式

MBR和GPT ?磁盤分區形式主要有兩種:MBR和GPT。?? MBR(Master Boot Record) MBR是一種較舊的分區形式,首次引入于1983年的IBM PC DOS 2.0。它位于驅動器的第一個扇區,包含460字節的引導代碼、64字節的磁盤分區表和…

幾個支持用戶名密碼的代理鏈工具: glider, gost, proxychains+microsocks

幾個支持用戶名密碼的代理鏈工具: glider, gost, proxychainsmicrosocks gost -L:7777 -Fsocks5://192.168.2.20:7575 -Fsocks5://user:passwd1.1.1.1:10086 -Dgost:(https://github.com/ginuerzh/gost) 參考 https://www.quakemachinex.com/blog/279.html

量子退火與機器學習(1):少量數據求解未知QUBO矩陣,以少見多

文章目錄 前言ー、復習QUBO:中藥配伍的復雜性1.QUBO 的介入:尋找最佳藥材組合 二、難題:QUBO矩陣未知的問題1.為什么這么難? 三、稀疏建模(Sparse Modeling)1. 欠定系統中的稀疏解2. L1和L2的選擇: 三、壓縮感知算法(C…

【連續學習之SSL算法】2018年論文Selfless sequential learning

1 介紹 年份:2018 期刊: arXiv preprint Aljundi R, Rohrbach M, Tuytelaars T. Selfless sequential learning[J]. arXiv preprint arXiv:1806.05421, 2018. 本文提出了一種名為SLNID(Sparse coding through Local Neural Inhibition and…

關于SNAT、DNAT及浮動地址

SNAT、DNAT SNAT、DNAT就是實現代理的功能。 SNAT 類似于客戶端代理:內網主機通過共享公網 IP 地址訪問外部服務。DNAT 類似于服務端代理:外部請求通過公網 IP 轉發到內網主機上的服務。 沒有大網地址的內部主機想要作為客戶端訪問外部網絡(主…

結構方程模型【SEM】:嵌套分層數據及數據分組分析

結構方程模型(System of Equations Model,簡稱SEM),在生態學和環境科學中通常指的是一組描述生態系統中能量、物質和信息流動的數學方程。這些方程可以是確定性的,也可以是隨機的,它們共同構成了一個模型&a…

hot100_56. 合并區間

以數組 intervals 表示若干個區間的集合,其中單個區間為 intervals[i] [starti, endi] 。 請你合并所有重疊的區間,并返回 一個不重疊的區間數組,該數組需恰好覆蓋輸入中的所有區間 。數據結構 二維鏈表存儲每個區間 方法 先對每個區間的…

Python大數據:基于Python的王者榮耀戰隊數據分析系統的設計與實現

系統展示 比賽信息管理 看板展示 系統管理 摘要 本文使用Python與MYSQL技術搭建了一個王者榮耀戰隊的數據分析系統。對用戶提出的功能進行合理分析,然后搭建開發平臺以及配置計算機軟硬件;通過對數據流圖以及系統結構的設計,創建相應的數據…

兩分鐘解決:vscode卡在設置SSH主機,VS Code-正在本地初始化VSCode服務器

問題原因 remote-ssh還是有一些bug的,在跟新之后可能會一直加載初始化SSH主機解決方案 1.打開終端2.登錄鏈接vscode的賬號,到家目錄下3.找到 .vscode-server文件,刪掉這個文件4.重啟 vscode 就沒問題了

深入理解與優化Java二維數組:從定義到性能提升的全面指南

1. 定義和初始化二維數組 在Java中,二維數組可以看作是數組的數組。你可以將它想象成一個矩陣或表格,每個元素是一個數組。 1.1 定義二維數組 二維數組的定義語法如下: datatype[][] arrayName;datatype 是數組元素的數據類型。arrayName…

day26 文件io

函數接口 1 .open和close 文件描述符:系統為用open打開的文件分配的標識符 非負的整形數據 0-1023 最小未被使用原則 使用完時及時釋放,避免文件描述符溢出 文件描述溢出就是文件使用完沒有及時關閉文件 int open(const char *pathname, int flags); /…

Java Stream流詳解——串行版

Stream流——串行版 ? Stream流是java8引入的特性&#xff0c;極大的方便了我們對于程序內數據的操作&#xff0c;提高了性能。通過函數式編程解決復雜問題。 1.BaseStream<T,S extense BaseStream<T,S>> ? 他是流處理的基石概念&#xff0c;重點不在于這個接…

el-backtop(返回頂部)

案例&#xff1a; <el-backtop target".app-main"><svg-icon icon-class"backtop" size"24px" /></el-backtop>

探秘“香水的 ChatGPT”:AI 開啟嗅覺奇幻之旅!

你沒有看錯&#xff0c;AI也能聞到味道了&#xff01;這是一家名為Osmo公司公布的信息&#xff0c;他們成功創造出了由AI生成的李子味道&#xff0c;快跟著小編一探究竟吧~ 【圖片來源于網絡&#xff0c;侵刪】 Osmo公司的這項技術&#xff0c;通過分析香味的化學成分和人類嗅…

Vue3入門(9)

1. 【 replace屬性】 作用&#xff1a;控制路由跳轉時操作瀏覽器歷史記錄的模式。 瀏覽器的歷史記錄有兩種寫入方式&#xff1a;分別為push和replace&#xff1a; - push是追加歷史記錄&#xff08;默認值&#xff09;。 - replace是替換當前記錄。 . 開啟replace模式&#xff…

第十九章 C++ 日期 時間

C 日期 & 時間 C 標準庫沒有提供所謂的日期類型。C 繼承了 C 語言用于日期和時間操作的結構和函數。為了使用日期和時間相關的函數和結構&#xff0c;需要在 C 程序中引用 <ctime> 頭文件。 有四個與時間相關的類型&#xff1a;clock_t、time_t、size_t 和 tm。類型…

電子配件行業的未來之路:產品說明書數字化轉型的力量

在科技飛速發展的今天&#xff0c;電子配件行業作為科技創新的前沿陣地&#xff0c;正經歷著前所未有的變革。從智能手機、平板電腦到智能穿戴設備&#xff0c;各種新型電子配件層出不窮&#xff0c;極大地豐富了人們的生活。然而&#xff0c;隨著產品種類的增多和功能的復雜化…