pytest demo

使用pytest与allure实现一个简单的测试demo

python的一个测试框架pytest

git_pytest.png

python鄙视链:pytest 鄙视 > unittest 鄙视 > robotframework 鄙视 > 记流水账 鄙视 > “hello world”小白!

由于在家里没有什么业务相关的东西可以做,所以将目光移向了我们的老朋友“豆瓣”

首先,实现一个简单的页面访问并查看是否访问正常

创建一个包含3个url的测试数据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]

接下来导入这次的主角们

import pytest
import allure

由于打算使用浏览器进行测试顺便导入一下selenium

from selenium import webdriver

开始测试环境的准备

  1. 使用装饰器@pytest.fixture将被装饰的函数driver可以当作参数传入测试代码中
  2. scope="module"表示这个函数在module(该py文件)层面只会运行一次
  3. 函数主体部分前三句是slenium的基本操作
  4. 使用yield生成器来返回driver的作用是当测试全部执行完之后才会执行后面的关闭浏览器的操作
@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. 前面两行装饰器的作用可以在报告中看到
  2. @pytest.mark.parametrize将待测试test_data传入,ids是测试点的名称
  3. 函数test_douban_url的参数中传入了上一步定义的url和在fixture中创建的 driver
  4. 使用assert进行断言判断结果的正确性
@allure.feature('豆瓣简单测试')
@allure.story('进入页面')
@pytest.mark.parametrize('url',test_data,ids=['douban','book','movie'])
def test_douban_url(url,driver):
    with allure.step('测试进入:{}'.format(url)):
        driver.get(url)
        if url == TEST_URL:
            assert driver.title == '豆瓣'
        elif url == TEST_BOOK_URL:
            assert driver.title == '豆瓣读书'
        else:
            assert 0 #豆瓣电影故意报错

同理,增加一个搜索图书的测试点

先写一个搜索的函数

@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创建一个function级别的函数(每次执行都有环境准备和清理的操作),跳转到豆瓣读书的首页

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

测试函数:

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/

结果输出:

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('进入页面')
    @pytest.mark.parametrize('url',test_data,ids=['douban','book','movie'])
    def test_douban_url(url,driver):
        with allure.step('测试进入:{}'.format(url)):
            driver.get(url)
            if url == TEST_URL:
                assert driver.title == '豆瓣'
            elif url == TEST_BOOK_URL:
                assert driver.title == '豆瓣读书'
            else:
>               assert 0 #豆瓣电影故意报错
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 ==============================================================================

将结果转换为allure报告,并将其展示到浏览器上

 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('进入页面')
@pytest.mark.parametrize('url',test_data,ids=['douban','book','movie'])
def test_douban_url(url,driver):
    with allure.step('测试进入:{}'.format(url)):
        driver.get(url)
        if url == TEST_URL:
            assert driver.title == '豆瓣'
        elif url == TEST_BOOK_URL:
            assert driver.title == '豆瓣读书'
        else:
            assert 0 #豆瓣电影故意报错


@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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,898评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,401评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,058评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,539评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,382评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,319评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,706评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,370评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,664评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,715评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,476评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,326评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,730评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,003评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,275评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,683评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,877评论 2 335

推荐阅读更多精彩内容

  • 在pytest中加入fixture的目的是提供一个固定的基准,使测试能够可靠、重复地执行,pytest的fixtu...
    何小有阅读 13,525评论 1 17
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,510评论 18 139
  • 这篇文章接着上一篇《探索pytest的fixture(上)》的内容讲。 使用fixture函数的fixture 我...
    何小有阅读 2,192评论 0 3
  • benchmark rate 基准利率 short-term crisis 短期贷款 financial cris...
    草莽书生阅读 138评论 0 0
  • 范佳鑫工作计划 投资部未来规划及人员分配 小组成员:张婵、李盼、朱莹、范佳鑫 工作内容: 1、投资人入口 【线上】...
    开始打铁的加薪阅读 194评论 0 0