前言
1、測試場景
給登錄今日頭條app的操作添加日志采集。
2、簡單配置代碼示例
import logging
from appium import webdriver
logging.basicConfig(filename='./testLog.log', level=logging.INFO,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
def android_driver():
desired_caps = {
"platformName": "Android",
"platformVersion": "10",
"deviceName": "PCT_AL10",
"appPackage": "com.ss.android.article.news",
"appActivity": ".activity.MainActivity",
"unicodeKeyboard": True,
"resetKeyboard": True,
"noReset": True,
}
logging.info("啟動今日頭條APP...")
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
return driver
def login_opera(driver):
'''登錄今日頭條操作'''
logging.info("開始登陸今日頭條APP...")
try:
driver.find_element_by_id("com.ss.android.article.news:id/cji").click() # 點擊【我知道了】
driver.find_element_by_id("android:id/button1").click() # 點擊權(quán)限管理-確定按鈕
driver.find_element_by_xpath("http://android.widget.TabWidget/android.widget.RelativeLayout[@index=3]").click() # 點擊未登錄
driver.find_element_by_id("com.ss.android.article.news:id/a10").click() # 未登錄頁點擊登錄按鈕
driver.find_element_by_id("com.ss.android.article.news:id/bgh").click() # 登錄頁點擊“。。?!?/span>
driver.find_element_by_xpath("http://android.widget.LinearLayout[@index=4]").click() # 選擇密碼登錄
driver.find_element_by_id("com.ss.android.article.news:id/bu").send_keys("xxxxxxx") # 輸入賬號
driver.find_element_by_id("com.ss.android.article.news:id/c5").send_keys("xxxxxxx") # 輸入密碼
driver.find_element_by_id("com.ss.android.article.news:id/a2o").click() # 點擊登錄
except Exception as e:
logging.error("登錄錯誤,原因為:{}".format(e))
else:
logging.info("登陸成功...")
driver = android_driver()
login_opera(driver)
登錄成功則日志輸出如下:
2023-08-09 18:20:05,119 logging_test.py[line:21] INFO 啟動今日頭條APP...
2023-08-09 18:20:10,119 logging_test.py[line:27] INFO 開始登陸今日頭條APP...
2023-08-09 18:21:07,120 logging_test.py[line:41] INFO 登陸成功...
3、拋出問題
上面示例代碼成功地獲取了日志信息,但這種寫法只能作用于當(dāng)前模塊。而一個自動化測試項目往往有多個模塊,如果在每個需要獲取日志的模塊都使用這樣的方式,顯然是不方便維護的。那么我們需要怎么解決呢?
4、解決思路
使用日志流處理流程。提供以下兩種思路:
思路1:使用python代碼實現(xiàn)日志配置。先創(chuàng)建日志記錄器,并設(shè)置好Handler與日志格式,如上面的logging_test.py模塊構(gòu)造logger,其他模塊采集日志時直接調(diào)用。
思路2:將日志的格式、輸出路徑等參數(shù)抽離出來放置在專門的配置文件里,如logging.conf,使用專門的模塊處理,使用時直接在模塊調(diào)用即可。
5、思路1——使用python代碼實現(xiàn)日志配置示例
目錄結(jié)構(gòu)
test.py中需要采集日志時,從logging_test.py導(dǎo)入logger即可。也可以將logging_test.py里的代碼進行進一步的封裝,再調(diào)用,這里僅僅只是示例。
logging_test.py
import logging
# 創(chuàng)建日志記錄器
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# 設(shè)置日志輸出格式
format= logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
# 創(chuàng)建一個Handler用于將日志寫入文件
logFile = './log.txt'
fh = logging.FileHandler(logFile, mode='a', encoding='utf-8')
fh.setLevel(logging.INFO)
fh.setFormatter(format)
logger.addHandler(fh)
# 同樣的,創(chuàng)建一個Handler用于控制臺輸出日志
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
ch.setFormatter(format)
logger.addHandler(ch)
test.py
from appium import webdriver
from log.logging_test import logger
def android_driver():
desired_caps = {
"platformName": "Android",
"platformVersion": "10",
"deviceName": "PCT_AL10",
"appPackage": "com.ss.android.article.news",
"appActivity": ".activity.MainActivity",
"unicodeKeyboard": True,
"resetKeyboard": True,
"noReset": True,
}
logger.info("啟動今日頭條APP...")
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
return driver
def login_opera(driver):
'''登錄今日頭條操作'''
logger.info("開始登陸今日頭條APP...")
try:
driver.find_element_by_id("com.ss.android.article.news:id/cji").click() # 點擊【我知道了】
driver.find_element_by_id("android:id/button1").click() # 點擊權(quán)限管理-確定按鈕
driver.find_element_by_xpath("http://android.widget.TabWidget/android.widget.RelativeLayout[@index=3]").click() # 點擊未登錄
driver.find_element_by_id("com.ss.android.article.news:id/a10").click() # 未登錄頁點擊登錄按鈕
driver.find_element_by_id("com.ss.android.article.news:id/bgh").click() # 登錄頁點擊“。。?!?/span>
driver.find_element_by_xpath("http://android.widget.LinearLayout[@index=4]").click() # 選擇密碼登錄
driver.find_element_by_id("com.ss.android.article.news:id/bu").send_keys("xxxxxx") # 輸入賬號
driver.find_element_by_id("com.ss.android.article.news:id/c5").send_keys("xxxxxx") # 輸入密碼
driver.find_element_by_id("com.ss.android.article.news:id/a2o").click() # 點擊登錄
except Exception as e:
logger.error("登錄錯誤,原因為:{}".format(e))
else:
logger.info("登陸成功...")
driver = android_driver()
login_opera(driver)
運行test.py,結(jié)果如下:
2023-08-09 11:45:05,119 logging_test.py[line:21] INFO 啟動今日頭條APP...
2023-08-09 11:45:11,119 logging_test.py[line:27] INFO 開始登陸今日頭條APP...
2023-08-09 11:45:20,120 logging_test.py[line:41] INFO 登陸成功...
6、思路2——日志格式配置示例
logger.conf文件:
[loggers] # loggers日志器對象列表,必須包含
keys=root, exampleLogger # 一定要包含root這個值,當(dāng)使用無參函數(shù)logging.getLogger()時,默認返回root這個logger,其他自定義logger可以通過logging.getLogger("exampleLogger")方式進行調(diào)用
[handlers] # handlers處理器對象列表,必須包含
keys=consoleHandler, fileHandler # 定義聲明handlers信息
[formatters] # formatters格式對象列表,必須包含
keys=form01,form02
[logger_root] # 對loggers中聲明的logger進行逐個配置,且要一一對應(yīng),在所有的logger中,必須制定lebel和handlers這兩個選項。對于非roothandler,還需要添加一些額外的option,如qualname、propagate等。handlers可以指定多個,中間用逗號隔開,比如handlers=fileHandler,consoleHandler,同時制定使用控制臺和文件輸出日志
level=DEBUG
handlers=consoleHandler, fileHandler
[logger_exampleLogger] # 配置日志處理器exampleLogger:設(shè)置日志級別、日志輸出指定的處理器配置文件,如consoleHandler,fileHandler
level=DEBUG
handlers=consoleHandler, fileHandler
qualname=exampleLogger # qualname 表示它在logger層級中的名字,在應(yīng)用代碼中通過這個名字制定所使用的handler
propagate=0 # 可選項,其默認是為1,表示消息將會傳遞給高層次logger的handler
[handler_consoleHandler] # 日志處理器consoleHandler的配置文件
class=StreamHandler # 定控制臺輸出。將日志消息發(fā)送到輸出到Stream,如std.out, std.err或任何file-like對象
level=DEBUG # 日志級別
formatter=form01 # 輸出格式
args=(sys.stdout,)
[handler_fileHandler] # 日志處理器fileHandler的配置文件
class=FileHandler # 將日志輸出至磁盤文件
level=DEBUG # 日志級別
formatter=form02 # 輸出格式
args=('./log.txt', 'a', 'UTF-8') # 參數(shù)如未設(shè)置絕對路徑,則默認生成在執(zhí)行文件log.py的工作目錄。指定日志文件的打開模式,默認為’a’
[formatter_form01] # 格式配置1
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
[formatter_form02] # 格式配置2
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
注意:
為了說明配置結(jié)構(gòu),這里的配置文件 logger.conf 里加了中文注釋,實際使用時需要將注釋去掉或改寫成英文注釋,否則會報編碼錯誤。
配置文件中包含三大主要模塊:loggers,handlers,formatters。這三個主要模塊包含的內(nèi)容都是通過keys進行指定,然后通過logger_key、handler_key、formatter_key對里面的key進行具體的設(shè)置。
配置handlers中的handler_consoleHandler的參數(shù):指定日志輸出到控制臺、級別、輸出格式、參數(shù)。
配置handlers中的handler_fileHandlers的參數(shù):指定將日志輸出至磁盤文件、設(shè)置日志級別、輸出格式、參數(shù)等。
配置日志輸出格式formatter_xxx,可配置多個,如:form01,form02。
讀取配置文件,創(chuàng)建日志記錄器logger:
baseLog.py
import logging.config
CON_LOG='./logger.conf' # 配置文件路徑
logging.config.fileConfig(CON_LOG) # '讀取日志配置文件'
logger = logging.getLogger('exampleLogger') # 創(chuàng)建一個日志器logger
調(diào)用示例
目錄結(jié)構(gòu)如下
test.py
from appium import webdriver
from log.baseLog import logger
def android_driver():
desired_caps = {
"platformName": "Android",
"platformVersion": "10",
"deviceName": "PCT_AL10",
"appPackage": "com.ss.android.article.news",
"appActivity": ".activity.MainActivity",
"unicodeKeyboard": True,
"resetKeyboard": True,
"noReset": True,
}
logger.info("啟動今日頭條APP...")
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
return driver
def login_opera(driver):
'''登錄今日頭條操作'''
logger.info("開始登陸今日頭條APP...")
try:
driver.find_element_by_id("com.ss.android.article.news:id/cji").click() # 點擊【我知道了】
driver.find_element_by_id("android:id/button1").click() # 點擊權(quán)限管理-確定按鈕
driver.find_element_by_xpath("http://android.widget.TabWidget/android.widget.RelativeLayout[@index=3]").click() # 點擊未登錄
driver.find_element_by_id("com.ss.android.article.news:id/a10").click() # 未登錄頁點擊登錄按鈕
driver.find_element_by_id("com.ss.android.article.news:id/bgh").click() # 登錄頁點擊“。。?!?/span>
driver.find_element_by_xpath("http://android.widget.LinearLayout[@index=4]").click() # 選擇密碼登錄
driver.find_element_by_id("com.ss.android.article.news:id/bu").send_keys("xxxxxx") # 輸入賬號
driver.find_element_by_id("com.ss.android.article.news:id/c5").send_keys("xxxxxx") # 輸入密碼
driver.find_element_by_id("com.ss.android.article.news:id/a2o").click() # 點擊登錄
except Exception as e:
logger.error("登錄錯誤,原因為:{}".format(e))
else:
logger.info("登陸成功...")
driver = android_driver()
login_opera(driver)
控制臺、log.txt輸出結(jié)果如下:
2023-08-09 11:30:35,119 logging_test.py[line:21] INFO 啟動今日頭條APP...
2023-08-09 11:30:40,119 logging_test.py[line:27] INFO 開始登陸今日頭條APP...
2023-08-09 11:31:12,120 logging_test.py[line:41] INFO 登陸成功...
下面是我整理的2023年最全的軟件測試工程師學(xué)習(xí)知識架構(gòu)體系圖 |
一、Python編程入門到精通
二、接口自動化項目實戰(zhàn)
三、Web自動化項目實戰(zhàn)
四、App自動化項目實戰(zhàn)
五、一線大廠簡歷
六、測試開發(fā)DevOps體系
七、常用自動化測試工具
八、JMeter性能測試
九、總結(jié)(尾部小驚喜)
相信自己的力量,勇往直前,不懼困難與挫折。擁抱夢想,放飛心靈,用汗水澆灌希望,用努力鑄就輝煌。每一次奮斗都是一次華麗蛻變,創(chuàng)造屬于自己的人生傳世,閃耀成為永恒之星。
熱情點燃夢想,努力點亮未來,奮斗的征程永不停歇。堅持信念,追求卓越,超越自我創(chuàng)造輝煌。每一次努力都是成長的契機,讓激情與毅力塑造輝煌人生。文章來源:http://www.zghlxwxcb.cn/news/detail-635397.html
奮斗是燃燒未來的火焰,努力是超越平凡的鑰匙。相信自己的力量,追逐夢想的腳步不停歇。奮發(fā)向前,創(chuàng)造輝煌,每一次努力都是青春的宣言,讓無限可能綻放人生的輝煌。文章來源地址http://www.zghlxwxcb.cn/news/detail-635397.html
到了這里,關(guān)于史上最細,自動化測試-logging日志采集詳細實戰(zhàn)(二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!