[Pytest][Part 4]多種測試運行方式

實現需求2:

有兩種運行測試的方式:

  1. 通過config配置文件運行,測試只需要修改config配置文件
  2. cmdline 運行

這里是新建一個config類來存儲所有的測試配置,以后配置有修改的話也只需要修改這個類。

根據目前的測試需求,config中有以下幾個屬性:

屬性作用備注
list_test????????按case list的flag,為True時生效
single_test單條運行case的flag,為True時生效
repeat? ? ??

case重復運行的次數

risk_analysis高風險case分析功能暫未實現
tester? ? ? ? ? ? ??測試者的用戶名,作為測試者發送郵件的收件人
case_list存儲測試case集,從這里取出需要運行的測試

具體類代碼為:

class TestConfig:"""測試配置管理"""_results_file = "test_results.json"_test_history = {}def __init__(self,list_test=False, single_test=False, repeat=1, case_list=None, risk_analysis=False,tester = None):self.list_test = list_testself.single_test = single_testself.repeat = repeatself.case_list = case_listself.risk_analysis = risk_analysisself.tester = tester

雖然有兩種運行腳本的方式,但是通過這兩種方式獲取的信息都會填充到config這個類中,然后從這個類中讀取當前需要運行的配置信息。 默認從配置文件中讀取測試信息,當配置文件不存在時,從cmdline中讀取測試信息。

圖一 配置信息讀取流程

最上層代碼實現:

    def get_test_config(self, config):"""1. read config from config file2. check flag of test config . if true , read test config from config fileif false , read test config from cmdline:param config: Object of Class TestConfig"""split_str = "="config_list = self.read_config_from_file(CONFIG_FILE)run_from_cfg_file = ast.literal_eval(config_list[0].split(split_str)[1].strip())if run_from_cfg_file:logger.info("reading test config from config file ......")self.parse_settings_to_config(config_list, config)else:self.read_config_from_cmdline(config)logger.info("getting test config from cmdline ......")

讀取配置文件

配置文件中包含兩類信息:

  1. 當前配置文件是否有效的flag(True or False),后面會根據這個flag來決定讀取config file還是cmdline
  2. 測試的具體信息,用于填充TestConfig對象的

代碼實現:返回一個包含配置信息的list

    def read_config_from_file(self, file_path):# config_file = "config_file.txt"# # get path of config_file.txt# file_path = os.path.join(os.getcwd(), config_file)config_list = []# check if config file is exist# if self.__file_exist_check(file_path):if self.config_file_status(file_path):try:with open(file_path) as file_handle:lines = file_handle.readlines()for line in lines:config_list.append(line.strip())except FileNotFoundError as e:logger.exception(f"file not found:{e}")except PermissionError as e:logger.exception(f"No permission to read the file:{e}")except Exception as e:logger.exception(f"file not found: {e}")return config_list   # config_list 正確else:logger.error("Config file is not exist....Please check again,Test Stop......")exit()

配置文件config_file.txt的內容為:

?--use_config=False
--list_test=True
--single_test=False
--case_list =test_list.txt
--repeat=15
--risk_analysis=False
--tester=TestUser

判斷是否使用配置文件

通過run_from_cfg_file 這個flag來判斷是讀取配置文件還是讀取cmdline

"""flag of run method ,from config file , or from cmdline
"""
run_from_cfg_file = False# config_list 為read_config_from_file()返回的config list
run_from_cfg_file = ast.literal_eval(config_list[0].split(split_str)[1].strip())if run_from_cfg_file:logger.info("reading test config from config file ......")self.parse_settings_to_config(config_list, config)else:self.read_config_from_cmdline(config)logger.info("getting test config from cmdline ......")

若run_from_cfg_file 為True,則從配置文件中讀取測試配置并調用方法parse_settings_to_config()填充到TestConfig對象中

# fill test settings to TestConfig objectdef parse_settings_to_config(self, arg_list, config):split_str = "="for item in arg_list:if "--list_test" in item:config.list_test = ast.literal_eval(item.split(split_str)[1].strip())  # transfer from string to bool typeelif "--single_test" in item:config.single_test = ast.literal_eval(item.split(split_str)[1].strip())  # transfer from string to bool typeelif "--case_list" in item:config.case_list = item.split(split_str)[1].strip()elif "--repeat" in item:config.repeat = item.split(split_str)[1].strip()elif "--risk_analysis" in item:config.risk_analysis = ast.literal_eval(item.split(split_str)[1].strip())  # transfer from string to bool typeelif "--tester=TestUser" in item:config.tester = item.split(split_str)[1].strip()

若run_from_cfg_file 為False,則調用方法read_config_from_cmdline()將cmdline中的配置填充到TestConfig配置中去。

 def get_cmdline_args(self):list = sys.argvreturn listdef read_config_from_cmdline(self,config):self.parse_settings_to_config(self.get_cmdline_args(),config)

至此通過配置文件和cmdline分別獲取測試配置信息的task就已經完成了。讀取配置信息的工作都是在tef_funtcion.py中的class FunctionApi中來完成的。完整代碼為:

"""
this file is api preset for test, all test function tool that needed is included in this python file
"""
import ast
import os.path
import sysfrom utils.TestLogger import TestLogger as TestLoggerconfig_file = "config_file.txt"
# get path of config_file.txt
CONFIG_FILE = os.path.join(os.getcwd(), config_file)"""flag of run method ,from config file , or from cmdline
"""run_from_cfg_file = False
logger = TestLogger().get_logger()class FunctionApi:# fill test settings to TestConfig objectdef parse_settings_to_config(self, arg_list, config):split_str = "="for item in arg_list:if "--list_test" in item:config.list_test = ast.literal_eval(item.split(split_str)[1].strip())  # transfer from string to bool typeelif "--single_test" in item:config.single_test = ast.literal_eval(item.split(split_str)[1].strip())  # transfer from string to bool typeelif "--case_list" in item:config.case_list = item.split(split_str)[1].strip()elif "--repeat" in item:config.repeat = item.split(split_str)[1].strip()elif "--risk_analysis" in item:config.risk_analysis = ast.literal_eval(item.split(split_str)[1].strip())  # transfer from string to bool typeelif "--tester=TestUser" in item:config.tester = item.split(split_str)[1].strip()def get_cmdline_args(self):list = sys.argvreturn listdef read_config_from_cmdline(self,config):self.parse_settings_to_config(self.get_cmdline_args(),config)def __file_exist_check(self, file_path):if os.path.exists(file_path):return Trueelse:logger.error(f"File {file_path} does not exist.")return Falsedef read_case_from_list_file(self):test_list = "test_list.txt"# get path of test_list.txtfile_path = os.path.join(os.getcwd(), test_list)# print("os.path.abspath:", os.path.abspath(__file__))  #獲取當前文件的絕對路徑C:\code\USBTestAndroid\utils\api.py# print("os.getcwd()", os.getcwd())                     #獲取調用該函數的項目路徑C:\code\USBTestAndroid# print("file path :", file_path)case_list = []try:with open(file_path) as file_handle:lines = file_handle.readlines()for line in lines:case_list.append(line.strip())except FileNotFoundError as e:logger.error(f"file not found:{e}")except PermissionError as e:logger.error(f"No permission to read the file:{e}")except Exception as e:logger.error(f"file not found: {e}")return case_listdef config_file_status(self, file_path):"""check if config file is exist:return: True ,exist;False not exist"""return self.__file_exist_check(file_path)def read_config_from_file(self, file_path):config_list = []if self.config_file_status(file_path):try:with open(file_path) as file_handle:lines = file_handle.readlines()for line in lines:config_list.append(line.strip())except FileNotFoundError as e:logger.exception(f"file not found:{e}")except PermissionError as e:logger.exception(f"No permission to read the file:{e}")except Exception as e:logger.exception(f"file not found: {e}")return config_list   # config_list 正確else:logger.error("Config file is not exist....Please check again,Test Stop......")exit()def get_test_config(self, config):"""1. read config from config file2. check flag of test config . if true , read test config from config fileif false , read test config from cmdline:param config: Object of Class TestConfig"""split_str = "="config_list = self.read_config_from_file(CONFIG_FILE)run_from_cfg_file = ast.literal_eval(config_list[0].split(split_str)[1].strip())if run_from_cfg_file:logger.info("reading test config from config file ......")self.parse_settings_to_config(config_list, config)else:self.read_config_from_cmdline(config)logger.info("getting test config from cmdline ......")

下面的工作就是利用讀取到的配置信息開始測試。

run_test.py:

    logger.info("Starting test execution...")config = TestConfig()functionApi.get_test_config(config)run_pytest(config)

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

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

相關文章

平衡二叉樹的刪除操作

對于平衡二叉樹的操作應對與考試只需要模擬出過程即可,且他的過程和插入的平衡方法一樣,不一樣的只是對于平衡因子的計算上。接下來我將給出方法①刪除結點(方法同“二叉排序樹”) ②一路向北找到最小不平衡子樹,找不到…

Spark 4.0的 VariantType 類型優點以及使用分析

背景 本文基于Spark 4.0。 總結 對于半結構化的數據來說,我們一般會有兩種方式進行存儲: 第一種是存儲為JSON String,這種可以保證Schema free,但是在使用的時候得解析為JSON,從而進行運算操作。 第二種是存儲為Struct類型,這種雖…

17-C#封裝,繼承,多態與重載

C#封裝繼承多態 1. 2. 3.多態 public abstract class animal//抽象類 {public abstract void eat();//抽象方法 } public class cat : animal//繼承 {public override void eat()//重寫{messagebox.show("cat eat");} } public class dog: animal//繼承 {public over…

恒創科技:香港站群服務器做seo站群優化效果如何

香港站群服務器做 SEO 站群優化效果如何?在當前搜索引擎優化競爭日益激烈的環境下,越來越多的企業開始關注站群策略這一高效的 SEO 手段。作為亞洲重要的網絡樞紐,香港站群服務器因其獨特優勢,正成為實施 SEO 站群優化的熱門選擇。本文將客觀…

Linux-進程管理

Linux-進程管理Linux 進程管理1. 進程的含義2. 進程狀態3. 進程工作模式4. 守護進程5. 進程查看命令5.1 ps 命令5.2 top 命令5.3 pstree 命令6. 終止進程的 kill 命令7. 前后臺運行8. 暫停進程9. 進程文件系統 /proc10. 定時任務管理10.1 at 命令10.2 batch 命令10.3 cron 與 c…

OpenCV圖像增強秘籍:高通濾波與特效藝術

> 在數字圖像處理領域,邊緣是圖像最富信息的區域。掌握高通濾波技術,你就能讓圖像中的隱藏細節"躍然紙上",甚至創造驚艷的藝術效果。 ## 一、圖像增強與高通濾波基礎 ### 1.1 圖像增強的核心目標 圖像增強不是簡單的美化,而是通過技術手段**突出重要特征*…

347. 前K個高頻元素

題目: 給你一個整數數組 nums 和一個整數 k ,請你返回其中出現頻率前 k 高的元素。你可以按 任意順序 返回答案。 示例: 輸入: nums [1,1,1,2,2,3], k 2 輸出: [1,2] 解題思路: 要返回出現頻率前k高的元素,那么我們首…

C++面試沖刺筆記1:虛函數的基本工作原理

C面試沖刺筆記1:虛函數的基本工作原理 前言 ? 筆者最近開始投簡歷,出于應對之后快速的面試流程需求,這里準備的是將常見的C八股文進行總結,從而方便自己進行學習,檢查和評估。 什么是虛函數 ? 虛函數,本質…

Spring Boot 事務失效問題詳解:原因、場景與解決方案

在 Spring Boot 開發中,事務管理是保證數據一致性和完整性的核心機制。然而,許多開發者在使用 Transactional 注解時,可能會遇到事務失效的問題,導致數據異常或業務邏輯錯誤。本文將深入分析 Spring Boot 中事務失效的常見原因&am…

Python-文件操作-StringIO和BytesIO-路徑操作-shutil模塊-csv,ini序列化和反序列化-argparse使用-學習筆記

序 欠4年前的一份學習筆記,獻給今后的自己。 文件操作 馮諾依曼體系架構CPU由運算器和控制器組成 運算器,完成各種算數運算、邏輯運算、數據傳輸等數據加工處理 。 控制器,控制程序的執行 存儲器,用于記憶程序和數據,例…

LLM的表征做減法的是什么,自然語言是一個矩陣,怎么進行減法的

LLM的表征做減法的是什么,自然語言是一個矩陣,怎么進行減法的 有個假設:就是最后一個詞語融合了前面詞語的信息 減法操作主要用于提取模型內部表征中的"誠實性"概念向量。具體來說,這是通過對比誠實和不誠實場景下的模型隱藏狀態實現的。 import torch from t…

Java創建型模式---單例模式

單例模式基礎概念單例模式是一種創建型設計模式,其核心思想是確保一個類僅有一個實例,并提供一個全局訪問點來獲取這個實例。在 Java 中實現單例模式主要有以下關鍵點:私有構造函數 - 防止外部通過new關鍵字創建實例靜態實例變量 - 類內部持有…

詳解Kafka重平衡機制詳解

Kafka 的重平衡機制(Rebalance)是確保消費者組內成員動態變化(如新成員加入、現有成員退出或崩潰、訂閱主題分區數變化)時,分區所有權能合理、公平地重新分配的核心機制。其目標是保證所有分區都有消費者處理&#xff…

代碼詳細注釋:文件IO在用戶管理系統中的應用實踐:C語言實現用戶名查重與密碼確認與支持日志記錄的終端用戶認證解決方案的注冊登錄系統

代碼/* 作業增強版注冊登錄系統 - 帶日志和安全性增強功能 */ #include <stdio.h> // 標準輸入輸出函數(printf, scanf等) #include <stdlib.h> // 標準庫函數(exit, malloc等) #include <string.h> // 字符串處理函數(strcmp, strcspn等) #inc…

Go與JS無縫協作:Goja引擎實戰之錯誤處理最佳實踐

引言&#xff1a;當Go邂逅JavaScript 在現代軟件開發中&#xff0c;跨語言協作已成為提升效率的關鍵。想象一下&#xff1a;用Go的高性能處理核心邏輯&#xff0c;同時用JavaScript的靈活性實現動態規則——這不再是夢想。Goja&#xff0c;這個純Go語言實現的JavaScript引擎&am…

繼承與多態:面向對象編程的兩大支柱

引言&#xff1a;為什么必須掌握繼承與多態&#xff1f; 在Java開發中&#xff0c;繼承與多態是構建可擴展、易維護系統的基石&#xff1a; 繼承&#xff1a;實現代碼復用&#xff0c;建立清晰的類層次結構多態&#xff1a;提升代碼靈活性&#xff0c;實現"編寫一次&#…

2025使用VM虛擬機安裝配置Macos蘋果系統下Flutter開發環境保姆級教程--上篇

前言 我們在學習Flutter開發的過程中&#xff0c;永遠都跳不過去的一個問題就是如何在MAC下開發并打包Flutter工程項目&#xff0c;但MAC開發首先要解決的問題就是我們一般技術人員的電腦都是WINDOWS操作系統&#xff0c;專門配置一臺MAC的話成本又是不得不考慮的因素&#xf…

250708-Svelte項目從Debian遷移到無法聯網的RHEL全流程指南

&#x1f4cc; 背景 在 Debian 上使用以下命令創建了一個 Svelte 項目&#xff1a; npm install -g sv npx sv create my-svelte-demo cd my-svelte-demo npm install npm run dev現在需要將該項目遷移到一臺 無法聯網的 RHEL 9.4 服務器 上運行&#xff0c;出現如下報錯&…

力扣 hot100 Day39

118. 楊輝三角 給定一個非負整數 numRows&#xff0c;生成「楊輝三角」的前 numRows 行。 class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>> res(numRows);for (int i 0; i < numRows; i) {res[i].resi…

HuggingFists: 無代碼處理復雜PDF

有過使用LLM搭建RAG或其它類知識系統的朋友一定會對文檔數據的復雜多樣性有著深刻的理解。各行各業的磁盤中都沉睡了數年到數十年的各類文檔信息&#xff0c;包括&#xff1a;Doc、Docx、PPT、PDF、XLS、PNG、JPEG等各類格式。利用LLM激活這些數據價值的首要工作就是能夠正確的…