Selenium(二)——用pytest編寫測試用例

上一小節(jié) Selenium(一)——Page Object Model (POM) 已經(jīng)把新浪微博登陸頁的頁面對象編寫完成,接下來繼續(xù)編寫測試用例拓春。

1. 簡介

  • 先安裝兩個python包:
    pip install pytest
    pip install pytest-html
    pytest 是一個測試框架,可以輕松構(gòu)建簡單且可擴(kuò)展的測試。pytest-html
    是 pytest 的一個插件,它為測試結(jié)果生成一個HTML報告邮利。

  • pytest 中的 fixture
    pytest 中的 fixture 可以類比于 unittest 中的 setUp&tearDown,但是又在此基礎(chǔ)上有所改進(jìn)垃帅,比如支持參數(shù)化等延届。

  • pytest-html 的報告格式
    為了遵守內(nèi)容安全策略(CSP),默認(rèn)情況下運用命令:pytest --html=report.html生成的測試報告會單獨存儲CSS和圖像等多個資源贸诚。您也可以創(chuàng)建一個獨立的報告方庭,在共享結(jié)果時更方便。這可以通過以下命令完成:
    pytest --html=report.html --self-contained-html

2. 編寫測試用例

運用 pytest 的參數(shù)化功能@pytest.mark.parametrize酱固,為同一個測試方法傳入不同的測試數(shù)據(jù)械念,可以將一個測試用例拓展成多個,避免了冗余代碼运悲。
參數(shù)化過程很簡單龄减,先準(zhǔn)備好測試數(shù)據(jù),在“新浪登陸頁面測試”中測試數(shù)據(jù)是多個元組拼成的一個列表扇苞,每個元組中裝載了各不相同的帳號欺殿、密碼寄纵、檢查信息:

testdata = [('', '', '請輸入登錄名'),   # 帳號鳖敷、密碼為空
            ('haha', '', '請輸入密碼'),     # 密碼為空
            ('', 'hehe', '請輸入登錄名'),   # 帳號為空
            ('haha', 'hehe', '用戶名或密碼錯誤脖苏。查看幫助'),     # 帳號、密碼錯誤
            ('haha@163.com', 'hehe', '請?zhí)顚戲炞C碼'),       # 密碼錯誤
]

然后定踱,用 pytest 提供的@pytest.mark.parametrize裝飾器棍潘,將數(shù)據(jù)綁定到測試方法上,就可以在方法中直接取用啦:

@pytest.mark.parametrize("username, password, message", testdata)
def test_login(self, username, password, message):

test_xl_login.py 內(nèi)容如下:

  1 import pytest
  2 from selenium import webdriver
  3 from xl_login import LoginPage
  4 
  5 
  6 # 準(zhǔn)備好測試數(shù)據(jù)
  7 testdata = [('', '', '請輸入登錄名'),   # 帳號崖媚、密碼為空
  8             ('haha', '', '請輸入密碼'),     # 密碼為空
  9             ('', 'hehe', '請輸入登錄名'),   # 帳號為空
 10             ('haha', 'hehe', '用戶名或密碼錯誤亦歉。查看幫助'),     # 帳號、密碼錯誤
 11             ('haha@163.com', 'hehe', '請?zhí)顚戲炞C碼'),       # 密碼錯誤
 12 ]
 13 
 14 # 定義fixture畅哑,class內(nèi)有效
 15 @pytest.fixture(scope="class")
 16 def login_ini(request):
 17     """
 18     初始化瀏覽器和登陸頁面
 19     完成測試后肴楷,結(jié)束driver
 20     """
 21     # 預(yù)打開頁面
 22     base_url = 'https://weibo.com/'
 23     # 頁面title
 24     title = '微博-隨時隨地發(fā)現(xiàn)新鮮事'
 25     # 打開Chrome瀏覽器
 26     driver = webdriver.Chrome()
 27     # 登陸頁面初始化
 28     request.cls.login = LoginPage(driver, base_url, title)
 29     # 卸載夾具,以下代碼將在最后一個測試用例結(jié)束后執(zhí)行
 30     yield login_ini
 31     driver.quit()
 32 
 33 # 使用fixture
 34 @pytest.mark.usefixtures("login_ini")
 35 class TestLogin():
 36     # 參數(shù)化
 37     @pytest.mark.parametrize("username, password, message", testdata)
 38     def test_login(self, username, password, message):
 39         """
 40         測試用例
 41         """
 42         login = self.login
 43         login.open()
 44         # 輸入用戶名
 45         login.type_username(username)
 46         # 輸入密碼
 47         login.type_password(password)
 48         # 點擊登陸
 49         login.submit()
 50         # 獲取提示框信息
 51         ms = login.get_message()
 52         # 判定檢測
 53         assert ms == messagegok

現(xiàn)在荠呐,創(chuàng)建一個 conftest.py 文件赛蔫,用于配置測試報告,以免報告中的中文字符無法選擇正確的編碼:

  1 from datetime import datetime
  2 from py.xml import html
  3 import pytest
  4 
  5 
  6 @pytest.mark.hookwrapper
  7 def pytest_runtest_makereport(item, call):
  8     outcome = yield
  9     report = outcome.get_result()
 10     # 對test一列重新編碼泥张,顯示中文
 11     report.nodeid = report.nodeid.encode("utf-8").decode("unicode_escape")

3. 運行測試用例

現(xiàn)在來試著運行一下測試用例:

>>> pytest ./test_xl_login.py --html=report.html --self-contained-html
============================================== test session starts ==============================================
platform linux -- Python 3.7.3, pytest-4.4.1, py-1.8.0, pluggy-0.10.0
rootdir: /home/user1/test/PageObject
plugins: metadata-1.8.0, html-1.20.0
collected 5 items                                                                                               

test_xl_login.py .....                                                                                    [100%]

--------------------- generated html file: /home/user1/test/PageObject/report.html ---------------------
=========================================== 5 passed in 27.18 seconds ===========================================

看看測試報告:
新浪微博登陸頁面測試報告.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呵恢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子媚创,更是在濱河造成了極大的恐慌渗钉,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钞钙,死亡現(xiàn)場離奇詭異鳄橘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)芒炼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門挥唠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人焕议,你說我怎么就攤上這事宝磨。” “怎么了盅安?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵唤锉,是天一觀的道長。 經(jīng)常有香客問我别瞭,道長窿祥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任蝙寨,我火速辦了婚禮晒衩,結(jié)果婚禮上嗤瞎,老公的妹妹穿的比我還像新娘。我一直安慰自己听系,他們只是感情好贝奇,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著靠胜,像睡著了一般掉瞳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浪漠,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天陕习,我揣著相機(jī)與錄音,去河邊找鬼址愿。 笑死该镣,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的响谓。 我是一名探鬼主播损合,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼歌粥!你這毒婦竟也來了塌忽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤失驶,失蹤者是張志新(化名)和其女友劉穎土居,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嬉探,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡擦耀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了涩堤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眷蜓。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖胎围,靈堂內(nèi)的尸體忽然破棺而出吁系,到底是詐尸還是另有隱情,我是刑警寧澤白魂,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布汽纤,位于F島的核電站,受9級特大地震影響福荸,放射性物質(zhì)發(fā)生泄漏蕴坪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望背传。 院中可真熱鬧呆瞻,春花似錦、人聲如沸径玖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挺狰。三九已至明郭,卻和暖如春买窟,著一層夾襖步出監(jiān)牢的瞬間丰泊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工始绍, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留瞳购,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓亏推,卻偏偏與公主長得像学赛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吞杭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容