pytest demo

使用pytest與allure實(shí)現(xiàn)一個(gè)簡單的測試demo

python的一個(gè)測試框架pytest

git_pytest.png

python鄙視鏈:pytest 鄙視 > unittest 鄙視 > robotframework 鄙視 > 記流水賬 鄙視 > “hello world”小白!

由于在家里沒有什么業(yè)務(wù)相關(guān)的東西可以做鳍贾,所以將目光移向了我們的老朋友“豆瓣”

首先,實(shí)現(xiàn)一個(gè)簡單的頁面訪問并查看是否訪問正常

創(chuàng)建一個(gè)包含3個(gè)url的測試數(shù)據(jù)test_data

TEST_URL = 'https://www.douban.com'
TEST_BOOK_URL = 'https://book.douban.com'
TEST_MOVIE_URL = 'https://movie.douban.com'
test_data = [TEST_URL,TEST_BOOK_URL,TEST_MOVIE_URL]

接下來導(dǎo)入這次的主角們

import pytest
import allure

由于打算使用瀏覽器進(jìn)行測試順便導(dǎo)入一下selenium

from selenium import webdriver

開始測試環(huán)境的準(zhǔn)備

  1. 使用裝飾器@pytest.fixture將被裝飾的函數(shù)driver可以當(dāng)作參數(shù)傳入測試代碼中
  2. scope="module"表示這個(gè)函數(shù)在module(該py文件)層面只會(huì)運(yùn)行一次
  3. 函數(shù)主體部分前三句是slenium的基本操作
  4. 使用yield生成器來返回driver的作用是當(dāng)測試全部執(zhí)行完之后才會(huì)執(zhí)行后面的關(guān)閉瀏覽器的操作
@pytest.fixture(scope='module')
def driver():
    driver = webdriver.Chrome(executable_path='./driver/chromedriver')
    driver.maximize_window()
    driver.implicitly_wait(3)
    yield driver
    driver.close()
  1. 前面兩行裝飾器的作用可以在報(bào)告中看到
  2. @pytest.mark.parametrize將待測試test_data傳入,ids是測試點(diǎn)的名稱
  3. 函數(shù)test_douban_url的參數(shù)中傳入了上一步定義的url和在fixture中創(chuàng)建的 driver
  4. 使用assert進(jìn)行斷言判斷結(jié)果的正確性
@allure.feature('豆瓣簡單測試')
@allure.story('進(jìn)入頁面')
@pytest.mark.parametrize('url',test_data,ids=['douban','book','movie'])
def test_douban_url(url,driver):
    with allure.step('測試進(jìn)入:{}'.format(url)):
        driver.get(url)
        if url == TEST_URL:
            assert driver.title == '豆瓣'
        elif url == TEST_BOOK_URL:
            assert driver.title == '豆瓣讀書'
        else:
            assert 0 #豆瓣電影故意報(bào)錯(cuò)

同理浅碾,增加一個(gè)搜索圖書的測試點(diǎn)

先寫一個(gè)搜索的函數(shù)

@allure.step('搜索:{1}')
def search(driver,message):
    driver.find_element_by_id('inp-query').send_keys(message)
    driver.find_element_by_xpath('//*[@id="db-nav-book"]/div[1]/div/div[2]/form/fieldset/div[2]/input').click()
    return driver.title

再用fixture創(chuàng)建一個(gè)function級(jí)別的函數(shù)(每次執(zhí)行都有環(huán)境準(zhǔn)備和清理的操作),跳轉(zhuǎn)到豆瓣讀書的首頁

@pytest.fixture
def book_driver(driver):
    driver.get(TEST_BOOK_URL)
    yield driver
    driver.get(TEST_BOOK_URL)

測試函數(shù):

test_book_data = ['掃地出門','朋友之間','觀山海','魚翅與花椒']

@allure.feature('豆瓣簡單測試')
@allure.story('豆瓣讀書搜索')
@pytest.mark.parametrize('book',test_book_data)
def test_doubanbook(book,book_driver):
    title_name = search(book_driver,book)
    assert book in title_name

在cmd中輸入

 pytest --alluredir ./result/

結(jié)果輸出:

zhongxindeMacBook-Pro:pytest_0 zhongxin$ pytest --alluredir ./result/
===================================================================================== test session starts ======================================================================================
platform darwin -- Python 3.6.4, pytest-3.3.2, py-1.5.2, pluggy-0.6.0
rootdir: /Users/zhongxin/Desktop/pytest_0, inifile:
plugins: splinter-1.9.1, metadata-1.7.0, html-1.19.0, bdd-2.21.0, allure-adaptor-1.7.10
collected 7 items                                                                                                                                                                              

test_web.py ..F....                                                                                                                                                                      [100%]

=========================================================================================== FAILURES ===========================================================================================
____________________________________________________________________________________ test_douban_url[movie] ____________________________________________________________________________________

url = 'https://movie.douban.com', driver = <selenium.webdriver.chrome.webdriver.WebDriver (session="9c0c45ffaf1bc420a9f8ab3753de121d")>

    @allure.feature('豆瓣簡單測試')
    @allure.story('進(jìn)入頁面')
    @pytest.mark.parametrize('url',test_data,ids=['douban','book','movie'])
    def test_douban_url(url,driver):
        with allure.step('測試進(jìn)入:{}'.format(url)):
            driver.get(url)
            if url == TEST_URL:
                assert driver.title == '豆瓣'
            elif url == TEST_BOOK_URL:
                assert driver.title == '豆瓣讀書'
            else:
>               assert 0 #豆瓣電影故意報(bào)錯(cuò)
E               assert 0

test_web.py:49: AssertionError
-------------------------------------------------------------------------------------- Captured log call ---------------------------------------------------------------------------------------
remote_connection.py       480 DEBUG    POST http://127.0.0.1:50486/session/9c0c45ffaf1bc420a9f8ab3753de121d/url {"url": "https://movie.douban.com", "sessionId": "9c0c45ffaf1bc420a9f8ab3753de121d"}
remote_connection.py       567 DEBUG    Finished Request
============================================================================= 1 failed, 6 passed in 93.74 seconds ==============================================================================

將結(jié)果轉(zhuǎn)換為allure報(bào)告报破,并將其展示到瀏覽器上

 allure generate ./result/ -o ./report/ --clean
 allure open -h 127.0.0.1 -p 8083 ./report/
allure_1.png
allure_2.png

完整代碼:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:zhongxin 
#datetime:2018/8/18 下午10:49
import pytest
from selenium import webdriver
import allure

TEST_URL = 'https://www.douban.com'
TEST_BOOK_URL = 'https://book.douban.com'
TEST_MOVIE_URL = 'https://movie.douban.com'
test_data = [TEST_URL,TEST_BOOK_URL,TEST_MOVIE_URL]
test_book_data = ['掃地出門','朋友之間','觀山海','魚翅與花椒']

@pytest.fixture(scope='module')
def driver():
    option = webdriver.ChromeOptions()
    option.add_argument('headless')
    driver = webdriver.Chrome(executable_path='./driver/chromedriver',chrome_options=option)
    # driver = webdriver.Chrome(executable_path='./driver/chromedriver')
    driver.maximize_window()
    driver.implicitly_wait(3)
    yield driver
    driver.close()

@pytest.fixture(name ='book_driver')
def book_driver(driver):
    driver.get(TEST_BOOK_URL)
    yield driver
    driver.get(TEST_BOOK_URL)

@allure.step('搜索:{1}')
def search(driver,message):
    driver.find_element_by_id('inp-query').send_keys(message)
    driver.find_element_by_xpath('//*[@id="db-nav-book"]/div[1]/div/div[2]/form/fieldset/div[2]/input').click()
    return driver.title

@allure.feature('豆瓣簡單測試')
@allure.story('進(jìn)入頁面')
@pytest.mark.parametrize('url',test_data,ids=['douban','book','movie'])
def test_douban_url(url,driver):
    with allure.step('測試進(jìn)入:{}'.format(url)):
        driver.get(url)
        if url == TEST_URL:
            assert driver.title == '豆瓣'
        elif url == TEST_BOOK_URL:
            assert driver.title == '豆瓣讀書'
        else:
            assert 0 #豆瓣電影故意報(bào)錯(cuò)


@allure.feature('豆瓣簡單測試')
@allure.story('豆瓣讀書搜索')
@pytest.mark.parametrize('book',test_book_data)
def test_doubanbook(book,book_driver):
    title_name = search(book_driver,book)
    assert book in title_name

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末割择,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子舆瘪,更是在濱河造成了極大的恐慌,老刑警劉巖红伦,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件英古,死亡現(xiàn)場離奇詭異,居然都是意外死亡昙读,警方通過查閱死者的電腦和手機(jī)召调,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來箕戳,“玉大人某残,你說我怎么就攤上這事×晡” “怎么了玻墅?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長壮虫。 經(jīng)常有香客問我澳厢,道長环础,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任剩拢,我火速辦了婚禮线得,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘徐伐。我一直安慰自己贯钩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布办素。 她就那樣靜靜地躺著角雷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪性穿。 梳的紋絲不亂的頭發(fā)上勺三,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音需曾,去河邊找鬼吗坚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛呆万,可吹牛的內(nèi)容都是我干的商源。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼桑嘶,長吁一口氣:“原來是場噩夢啊……” “哼炊汹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起逃顶,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤讨便,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后以政,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體霸褒,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年盈蛮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了废菱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抖誉,死狀恐怖殊轴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情袒炉,我是刑警寧澤旁理,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站我磁,受9級(jí)特大地震影響孽文,放射性物質(zhì)發(fā)生泄漏驻襟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一芋哭、第九天 我趴在偏房一處隱蔽的房頂上張望沉衣。 院中可真熱鬧,春花似錦减牺、人聲如沸豌习。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斑鸦。三九已至,卻和暖如春草雕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背固以。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國打工墩虹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人憨琳。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓诫钓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親篙螟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子菌湃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

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

  • 在pytest中加入fixture的目的是提供一個(gè)固定的基準(zhǔn),使測試能夠可靠遍略、重復(fù)地執(zhí)行惧所,pytest的fixtu...
    何小有閱讀 13,540評(píng)論 1 17
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)绪杏,斷路器下愈,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • 這篇文章接著上一篇《探索pytest的fixture(上)》的內(nèi)容講。 使用fixture函數(shù)的fixture 我...
    何小有閱讀 2,205評(píng)論 0 3
  • benchmark rate 基準(zhǔn)利率 short-term crisis 短期貸款 financial cris...
    草莽書生閱讀 139評(píng)論 0 0
  • 范佳鑫工作計(jì)劃 投資部未來規(guī)劃及人員分配 小組成員:張嬋蕾久、李盼势似、朱瑩、范佳鑫 工作內(nèi)容: 1僧著、投資人入口 【線上】...
    開始打鐵的加薪閱讀 196評(píng)論 0 0