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

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
开始测试环境的准备
- 使用装饰器
@pytest.fixture
将被装饰的函数driver
可以当作参数传入测试代码中 -
scope="module"
表示这个函数在module(该py文件)层面只会运行一次 - 函数主体部分前三句是slenium的基本操作
- 使用
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()
- 前面两行装饰器的作用可以在报告中看到
-
@pytest.mark.parametrize
将待测试test_data
传入,ids是测试点的名称 - 函数
test_douban_url
的参数中传入了上一步定义的url
和在fixture
中创建的driver
- 使用
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/


完整代码:
#!/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
网友评论