1. 將程序中不常變化的數據放在配置文件中,有什么好處?
將配置統一放在一起,進行統一管理,方便維護,方便修改
- 配置文件將存放測試數據比如:
- Excel文件名、
- 日志名、
- 用例執行的結果、
- 實際結果和用例執行結果寫入到哪一行、
- HTML報告的名稱、
- 報告的標題、
- 報告的詳細程度、
- 報告的描述信息、
- 測試人員的名字、
- url的地址、
- 登錄的賬號密碼
2. 結構
- 配置文件名以 .conf、.ini 為拓展名的文件叫做配置文件
- 配置文件中使用英文 # ; 進行注釋,等號= 與冒號: 意思一樣
- 區域名(區分大小寫)
- 選項名 = 選項值
[file_path]
cases_path = cases.xlsx
在創建配置文件后,會出現提示信息
3. 讀取配置文件基本操作
# 讀取配置文件需要導入一個類:configparser (譯:康飛哥盤思)系統自帶不需要安裝 from configparser import ConfigParser # 1.創建配置解析器 config = ConfigParser() # 2.指定讀取的配置文件.read(譯:瑞德):指定讀取的文件名,文件名可以是相對或絕對路徑 config.read("testcase.conf", encoding="utf-8") # 3.讀取數據-------讀取的是哪個區域下的那個選項名 # 方法一:使用方括號["區域名"]["選項名"] one_value = config["file path"]["cases_path"] # 方法二:使用.get("區域名", "選項名") -----推薦使用這個 two_value = config.get("msg", "success_result") # 從配置文件中,使用方括號或者get讀取的所有值都是字符串類型 # 可以使用 getboolean (譯:給特.堡壘恩)方法獲取 bool 類型的數據 config.getboolean("msg", "va1") # 可以使用getboolean方法獲取bool類型的數據 # 1、yes、on、true、True ---> 都會讀取為布爾類型True # 0、no、off、false、False ---> 都會讀取為布爾類型False # 可以使用 getfloat 方法獲取 float (譯:副樓特)類型的數據 config.getfloat("msg", "value2") # 可以使用 getint 方法獲取 int 類型的數據 config.getint("msg", "value1") # 讀取列表 one_list = config.get('msg', 'value7') # eval 函數能夠將字符串轉換為 python 中的內置類型 # 相當如把字符串的引號(單引號或者雙引號)去掉之后的類型 # 也能夠執行字符串類表達式 one_list = eval(one_list)
# 讀取 配置文件下 某個區域的 所有 key、valu
print(config.items('區域名'))
4. 寫入配置文件基本操作
---不建議對已有文件進行寫入,會覆蓋掉源文件
from configparser import ConfigParser # 1.創建配置解析器 config = ConfigParser() # 2.寫入配置的時候,不用使用read(read是讀) # 構造要寫入的數據,嵌套字典的字典 datas = { "file path": { "cases_path": "cases1.xlsx", "log_path": "record_run_result.txt" }, "msg1": { "success_result": "Pass", "fail_result": "Fail" } } # 讀取配置寫入----config['區域名']['選項名'] for key in datas: config[key] = datas[key] # config相當於一個空字典 # 3.保存到文件 a = 追加,w = 寫入 with open("write_config.ini", "w") as file: config.write(file)
5. 配置文件讀寫數據的封裝,會用到 configparser 庫(譯:康飛哥盤思)
# 封裝配置文件 from configparser import ConfigParser class HandleConfig: """ 配置文件讀寫數據的封裝 """ def __init__(self, filename): """ :param filename: 配置文件名 """ self.filename = filename self.config = ConfigParser() # 讀取配置文件1.創建配置解析器 self.config.read(self.filename, encoding="utf-8") # 讀取配置文件2.指定讀取的配置文件 # get_value獲取所有的字符串,section區域名, option選項名 def get_value(self, section, option): return self.config.get(section, option) # get_int獲取整型,section區域名, option選項名 def get_int(self, section, option): return self.config.getint(section, option) # get_float獲取浮點數類型,section區域名, option選項名 def get_float(self, section, option): return self.config.getfloat(section, option) # get_boolean(譯:比例恩)獲取布爾類型,section區域名, option選項名 def get_boolean(self, section, option): return self.config.getboolean(section, option) # get_eval_data 獲取列表,section區域名, option選項名 def get_eval_data(self, section, option): return eval(self.config.get(section, option)) # get 獲取后為字符串,再用 eval 轉換為列表 @staticmethod def write_config(datas, filename): """ 寫入配置操作 :param datas: 需要傳入寫入的數據 :param filename: 指定文件名 :return: """ # 做校驗,為嵌套字典的字典才可以(意思.隱私.談.ce) if isinstance(datas, dict): # 遍歷,在外層判斷是否為字典 # 再來判斷內層的 values 是否為字典 for value in datas.values(): # 先取出value if not isinstance(value, dict): # 在判斷 return "數據不合法, 應為嵌套字典的字典" config = ConfigParser() # 1.創建配置解析器---與寫入配置操作一致 for key in datas: # 寫入操作 config[key] = datas[key] # config 類似於一個空字典 with open(filename, "w") as file: # 保存到哪個文件filename=需要指定文件名 config.write(file) # return "寫入成功" # do_config = HandleConfig('testcase.conf') if __name__ == '__main__': # 讀取操作 do_config1 = HandleConfig('testcase.conf') # 讀取那個文件 res = do_config1.get_value("msg", "success_result") # 讀取什么內容 print(res) # 寫入操作 do_config = HandleConfig('write_config.ini') datas = { "file path": { "cases_path": "cases.xlsx", "log_path": "record_run_result.txt" }, "msg": { "success_result": "Pass", "fail_result": "Fail" } } do_config.write_config(datas, "write_config.ini") pass
補充:以 .ini 結尾的配置文件
想將日志的級別、名字單獨配置,可修改。.ini 、 .yaml
ConfigParser類、 PyYaml模塊
1、實例化
conf = ConfigParser()
2、將文件中的數據讀取
conf.read("配置文件路徑",encoding="utf-8")
3、讀取出來默認是字符串
conf.get(section名字,option名字)
4、支持讀取出來為:bool,int,float
conf.getboolean(section,option)
conf.getint(section,option)
conf.getfloat(section,option)
修改操作(了解一下):
1、在已有section下添加/修改 option和value
conf.set(section,option,value)
2、若要新增 section:
conf.add_section(section名字)
3、將1中的變更寫入到配置文件當中。
conf.write(open(文件,“w”,encoding=”utf-8”))
from configparser import ConfigParser # 1、實例化 conf = ConfigParser() # 2、將文件中的數據讀取 conf.read("log.ini", encoding="utf-8") # 3、使用get函數獲取section下的option值 # log必須要有,name也必須存在 value = conf.get("log", "name") print(value) # 結果:py43_xj # 讀取log下的所有key value print(conf.items("log")) # 結果:[('name', 'py43_xj'), ('level', 'DEBUG'), ('logfile_name', 'test.log')]
補充:以 .yaml 結尾的配置文件
YAML 是一種簡潔的非標記語言。
YAML以數據為中心,使用空白,縮進,分行組織數據,從而使得表示更加簡潔易
基本規則:
1、大小寫敏感
2、使用縮進表示層級關系 -
3、禁止使用 tab 縮進,只能使用空格鍵
4、縮進長度沒有限制,只要元素對齊就表示這些元素屬於一個層級。
5、使用 # 表示注釋
6、字符串可以不用引號標注
yaml 讀取后只能是 列表 或字典:只能全部取出來,不能不分數據
1、字典
使用冒號(:)表示鍵值對,同一縮進的所有鍵值對屬於一個map
#Yaml 方式一(注意冒號后的空格)
platformName: Android
platformVersion: 5.1
2、列表
使用連字符(-)表示,注意-后的空格
- hello
- world
3、scalar,純量
字符串、數字、布爾值。不可變數據類型。
py讀取yaml文件:
1、第三方庫:pyyaml模塊
2、安裝:pip install pyyaml
3、從yaml文件讀取數據只有3步:
3.0 引入yaml: import yaml
3.1 打開yaml文件: open函數
3.2 調用yaml.load加載文件對象,為python對象。
示例:
# 整個文件都是字典形式 # 字典形式 user: xiaojian passwd: 11111 port: 3306 host: 127.0.0.1 db_name: nmb_python # 字典里面嵌套 列表 形式 log: - abc - 111 - hello - world # 字典里面嵌套 字典 形式 test: key: value weekend: happy age: 18
===
# 讀取出來是個列表 - 123 - 344 - 234 # 列表里面嵌套 字典 - key: value hello: 耶耶 # 列表里面嵌套 列表 - - 123 - 345 - 222 - 121
==
示例:讀取 yaml 文件
fs = open(yaml文件路徑,encoding="utf-8")
s = yaml.load(fs,yaml.FullLoader)
import yaml with open("db.yaml",encoding="utf-8") as fs: s = yaml.load(fs,yaml.FullLoader) print(s) with open("11.yaml",encoding="utf-8") as fs: s = yaml.load(fs,yaml.FullLoader) print(s) # {'user': 'xiaojian', 'passwd': 11111, 'port': 3306, 'host': '127.0.0.1', 'db_name': 'nmb_python', 'log': ['abc', 111, 'hello', 'world'], 'test': {'key': 'value', 'weekend': 'happy', 'age': 18}} [123, 344, 234, {'key': 'value', 'hello': '耶耶'}, [123, 345, 222, 121]]
py讀取yaml文件:
1、第三方庫:pyyaml模塊
2、安裝:pip install pyyaml
3、從yaml文件讀取數據只有3步:
3.0 引入yaml: import yaml
3.1 打開yaml文件: open函數
3.2 調用yaml.load加載文件對象,為python對象。