前言
今天呢筆者想和大家來聊聊selenium自動化+ pytest測試框架,在這篇文章里你需要知道一定的python基礎(chǔ)——至少明白類與對象,封裝繼承;一定的selenium基礎(chǔ)。這篇文章不會selenium,不會的可以自己去看selenium中文翻譯網(wǎng)喲。
一、測試框架簡介
測試框架有什么優(yōu)點呢:
-
- 代碼復(fù)用率高,如果不使用框架的話,代碼會很冗余
- 可以組裝日志、報告、郵件等一些高級功能
- 提高元素等數(shù)據(jù)的可維護性,元素發(fā)生變化時,只需要更新一下配置文件
- 使用更靈活的PageObject設(shè)計模式
- 測試框架的整體目錄
- 目錄/文件說明是否為python包common這個包中存放的是常見的通用的類,如讀取配置文件是config配置文件目錄是logs日志目錄page對selenium的方放進行深度的封裝是page_element頁面元素存放目錄page_object頁面對象POM設(shè)計模式,TestCase所有的測試用例集是utils工具類是script腳本文件conftest.pypytest膠水文件pytest.inipytest配置文件,這樣一個簡單的框架結(jié)構(gòu)就清晰了。
知道了以上這些我們就開始吧!
我們在項目中先按照上面的框架指引,建好每一項目錄。
注意:python包為是的,都需要添加一個__init__.py文件以標(biāo)識此目錄為一個python包。
二、管理時間
首先呢,因為我們很多的模塊會用到時間戳,或者日期等等字符串,所以我們先單獨把時間封裝成一個模塊。
然后讓其他模塊來調(diào)用即可。在utils目錄新建times.py模塊
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import time
import datetime
from functools import wraps
def timestamp():
"""時間戳"""
return time.time()
def dt_strftime(fmt="%Y%m"):
"""
datetime格式化時間
:param fmt "%Y%m%d %H%M%S
"""
return datetime.datetime.now().strftime(fmt)
def sleep(seconds=1.0):
"""
睡眠時間
"""
time.sleep(seconds)
def running_time(func):
"""函數(shù)運行時間"""
@wraps(func)
def wrapper(*args, **kwargs):
start = timestamp()
res = func(*args, **kwargs)
print("校驗元素done!用時%.3f秒!" % (timestamp() - start))
return res
return wrapper
if __name__ == '__main__':
print(dt_strftime("%Y%m%d%H%M%S"))
現(xiàn)在我也找了很多測試的朋友,做了一個分享技術(shù)的交流群,共享了很多我們收集的技術(shù)文檔和視頻教程。
如果你不想再體驗自學(xué)時找不到資源,沒人解答問題,堅持幾天便放棄的感受
可以加入我們一起交流。而且還有很多在自動化,性能,安全,測試開發(fā)等等方面有一定建樹的技術(shù)大牛
分享他們的經(jīng)驗,還會分享很多直播講座和技術(shù)沙龍
可以免費學(xué)習(xí)!劃重點!開源的!??!
qq群號:691998057【暗號:csdn999】
三、添加配置文件
配置文件是項目中必不可少的部分!
將固定不變的信息集中在固定的文件中
3.1conf.py
項目中都應(yīng)該有一個文件對整體的目錄進行管理,我也在這個python項目中設(shè)置了此文件。
在項目config目錄創(chuàng)建conf.py文件,所有的目錄配置信息寫在這個文件里面。
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import os
from selenium.webdriver.common.by import By
from utils.times import dt_strftime
class ConfigManager(object):
# 項目目錄
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 頁面元素目錄
ELEMENT_PATH = os.path.join(BASE_DIR, 'page_element')
# 報告文件
REPORT_FILE = os.path.join(BASE_DIR, 'report.html')
# 元素定位的類型
LOCATE_MODE = {
'css': By.CSS_SELECTOR,
'xpath': By.XPATH,
'name': By.NAME,
'id': By.ID,
'class': By.CLASS_NAME
}
# 郵件信息
EMAIL_INFO = {
'username': '1234567890@qq.com', # 切換成你自己的地址
'password': 'QQ郵箱授權(quán)碼',
'smtp_host': 'smtp.qq.com',
'smtp_port': 123
}
# 收件人
ADDRESSEE = [
'1234567890@qq.com',
]
@property
def log_file(self):
"""日志目錄"""
log_dir = os.path.join(self.BASE_DIR, 'logs')
if not os.path.exists(log_dir):
os.makedirs(log_dir)
return os.path.join(log_dir, '{}.log'.format(dt_strftime()))
@property
def ini_file(self):
"""配置文件"""
ini_file = os.path.join(self.BASE_DIR, 'config', 'config.ini')
if not os.path.exists(ini_file):
raise FileNotFoundError("配置文件%s不存在!" % ini_file)
return ini_file
cm = ConfigManager()
if __name__ == '__main__':
print(cm.BASE_DIR)
注意:QQ郵箱授權(quán)碼怎么生成自己去百度
這個conf文件我模仿了Django的settings.py文件的設(shè)置風(fēng)格,但是又有些許差異。
在這個文件中我們可以設(shè)置自己的各個目錄,也可以查看自己當(dāng)前的目錄。
遵循了約定:不變的常量名全部大寫,函數(shù)名小寫??雌饋碚w美觀。
3.2config.ini
在項目config目錄新建一個config.ini文件,里面暫時先放入我們的需要測試的URL
[HOST]
HOST = https://www.baidu.com
四、讀取配置文件
配置文件創(chuàng)建好了,接下來我們需要讀取這個配置文件以及使用里面的信息。
我們在common目錄中新建一個readconfig.py文件
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import configparser
from config.conf import cm
HOST = 'HOST'
class ReadConfig(object):
"""配置文件"""
def __init__(self):
self.config = configparser.RawConfigParser() # 當(dāng)有%的符號時請使用Raw讀取
self.config.read(cm.ini_file, encoding='utf-8')
def _get(self, section, option):
"""獲取"""
return self.config.get(section, option)
def _set(self, section, option, value):
"""更新"""
self.config.set(section, option, value)
with open(cm.ini_file, 'w') as f:
self.config.write(f)
@property
def url(self):
return self._get(HOST, HOST)
ini = ReadConfig()
if __name__ == '__main__':
print(ini.url)
可以看到我們用python內(nèi)置的configparser模塊對config.ini文件進行了讀取。
對于url值的提取,我使用了高階語法@property屬性值,寫法更簡單。
五、記錄操作日志
日志,大家應(yīng)該都很熟悉這個名詞,就是記錄代碼中的動作。
在utils目錄中新建logger.py文件。
這個文件就是我們用來在自動化測試過程中記錄一些操作步驟的。
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import logging
from config.conf import cm
class Log:
def __init__(self):
self.logger = logging.getLogger()
if not self.logger.handlers:
self.logger.setLevel(logging.DEBUG)
# 創(chuàng)建一個handle寫入文件
fh = logging.FileHandler(cm.log_file, encoding='utf-8')
fh.setLevel(logging.INFO)
# 創(chuàng)建一個handle輸出到控制臺
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
# 定義輸出的格式
formatter = logging.Formatter(self.fmt)
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 添加到handle
self.logger.addHandler(fh)
self.logger.addHandler(ch)
@property
def fmt(self):
return '%(levelname)s\t%(asctime)s\t[%(filename)s:%(lineno)d]\t%(message)s'
log = Log().logger
if __name__ == '__main__':
log.info('hello world')
在終端中運行該文件,就看到命令行打印出了:
INFO 2022-06-15 16:00:05,467 [logger.py:38] hello world
然后在項目logs目錄下生成了當(dāng)月的日志文件。
六、簡單理解POM模型
由于下面要講元素相關(guān)的,所以首先理解一下POM模型
Page Object模式具有以下幾個優(yōu)點。
該觀點來自 《Selenium自動化測試——基于Python語言》
- 抽象出對象可以最大程度地降低開發(fā)人員修改頁面代碼對測試的影響, 所以, 你僅需要對頁
面對象進行調(diào)整, 而對測試沒有影響; - 可以在多個測試用例中復(fù)用一部分測試代碼;
- 測試代碼變得更易讀、 靈活、 可維護
Page Object模式圖
- basepage ——selenium的基類,對selenium的方法進行封裝
- pageelements——頁面元素,把頁面元素單獨提取出來,放入一個文件中
- searchpage ——頁面對象類,把selenium方法和頁面元素進行整合
- testcase ——使用pytest對整合的searchpage進行測試用例編寫
通過上圖我們可以看出,通過POM模型思想,我們把:
- selenium方法
- 頁面元素
- 頁面對象
- 測試用例
以上四種代碼主體進行了拆分,雖然在用例很少的情況下做會增加代碼,但是當(dāng)用例多的時候意義很大,代碼量會在用例增加的時候顯著減少。我們維護代碼變得更加直觀明顯,代碼可讀性也變得比工廠模式強很多,代碼復(fù)用率也極大的得到了提高。
這篇文章暫時到這里喲,后面會接著講的喲。
下面是配套資料,對于做【軟件測試】的朋友來說應(yīng)該是最全面最完整的備戰(zhàn)倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!
最后: 可以在公眾號:自動化測試老司機?! 免費領(lǐng)取一份216頁軟件測試工程師面試寶典文檔資料。以及相對應(yīng)的視頻學(xué)習(xí)教程免費分享!,其中包括了有基礎(chǔ)知識、Linux必備、Shell、互聯(lián)網(wǎng)程序原理、Mysql數(shù)據(jù)庫、抓包工具專題、接口測試工具、測試進階-Python編程、Web自動化測試、APP自動化測試、接口自動化測試、測試高級持續(xù)集成、測試架構(gòu)開發(fā)測試框架、性能測試、安全測試等。文章來源:http://www.zghlxwxcb.cn/news/detail-859957.html
如果我的博客對你有幫助、如果你喜歡我的博客內(nèi)容,請 “點贊” “評論” “收藏” 一鍵三連哦!文章來源地址http://www.zghlxwxcb.cn/news/detail-859957.html
到了這里,關(guān)于Selenium + Pytest自動化測試框架實戰(zhàn)(上)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!