Python之pytest从基础到实战(二十六) - Go语言中文社区

Python之pytest从基础到实战(二十六)


一、安装与入门

1.1安装     

     pytest是python语言的一个测试的第三方的库,那么我们首先需要-安装它,安装的命令是:

                                                   pip  install   -U pytest

见如下安装该库的执行过程的截图:

安装成功后,我们可以查看它的版本以及是否安装成功,在cmd的命令提示符中,直接输入pytest  --version,如果未出现任何的错误,表示安装成功,见截图:

1.2第一个测试运行

    OK,如上我们已经安装成功了,下来我们来应用它,通过具体的案例来看pytest的实际应用。我们编写一个简单的函数,并且对该函数进行测试,使用pytest

来查看执行的结果,见案例代码:

复制代码
#!/usr/bin/env python 
#-*-coding:utf-8-*-

def func(x):
    return x+1

def test_answer():
    assert  func(3)==5
复制代码

我们到该模块的目录下,输入pytest(模块的名字必须是test开头,切记!),见该代码执行的结果,见截图:

见如上的截图,我们看到了执行的结果,该断言执行失败,您可以简单地使用 assert 语句来断言测试期望。pytest 的高级断言内省将智能地报告 assert 表达式的中间值, 从而使

您不必学习其它的断言的方法,OK,我们把代码进行修改下,看断言执行成功的情况,见修改后的代码:

复制代码
#!/usr/bin/env python 
#-*-coding:utf-8-*-

def func(x):
    return x+1

def test_answer():
    assert  func(3)==4
复制代码

再次执行pytest(模块名称是test_xpytest.py,切记,执行pytest的时候,模块名称最好是test开头的),见执行的截图:

1.3运行多个测试

       在一个包中,或者说一个模块的文件中,它是有多个文件的,比如一个包中,pytest它是执行多个以test开头的模块的文件的,我们先来看这种

情况的,我们在一个包中定义二个模块文件,分别是test_first.py,test_second,然后编写测试的代码,我们在该包中,执行pytest,见test_first.py的

代码:

复制代码
#!/usr/bin/env python 
#-*-coding:utf-8-*-

def func(x):
    return x+1

def test_answer():
    assert  func(3)==4
复制代码

见test_second.py模块的代码:

复制代码
#!/usr/bin/env python 
#-*-coding:utf-8-*-

def add(a,b):
return a+b

def test_sum():
assert add(2,3)==5
复制代码

见包的模块组织结构,见截图:

我们到该目录下,执行pytest命令,看执行的结果:

依据如上的截图,我们可以看到,执行pytest的命令后,执行了test_first.py,test_second.py模块文件中的代码,切记,pytest执行的时候,只执行test开头的模块,

以及test_开头的函数或者方法,如果我们把test_second.py修改成second.py,执行pytest后,就不会执行second.py文件中的代码了,见修改后的目录结构:

执行pytest,应该只执行test_first.py模块中的代码,见执行的结果截图:

另外,我们在上面强调的,模块中的函数或者方法也是需要test开头的,如果我们把second.py修改成test_second.py,该模块中的代码为如下的,执行pytest后,

也不会执行test_second.py模块的测试代码,见修改后的test_second.py代码:

见执行pytest后它的结果,是只执行test_first.py模块中的测试代码,不会执行test_second.py模块中的测试代码,具体原因上面截图中已经备注,见执行的结果:

如果要断言某些代码来导致异常,可以使用raise来产生,我们来看看如下的代码,见代码:

复制代码
#!/usr/bin/env python
#-*-coding:utf-8-*-

import  pytest

def f():
    raise  SystemExit(1)

def test_mytest():
    with pytest.raises(SystemExit):
        f()
复制代码

执行pytest见执行的结果:

如果我们要看执行的结果更加简单的信息,执行的命令由pytest修改成pytest -q 或者pytest -q 模块名称,见二种执行的结果方式结果:

1.4执行类中的测试

     在上面说过,通过执行pytest执行模块中的函数或者类中的方法,那么我们就来实现执行类中的测试方法,见测试代码:

复制代码
#!/usr/bin/env python
#-*-coding:utf-8-*-

import  unittest

def div(a,b):
    return a-b


class DivTest(unittest.TestCase):
    def test_div_001(self):
        self.assertEqual(div(3,2),1)

    def test_div_002(self):
        self.assertEqual(div(3,3),0)

    def test_div_003(self):
        self.assertEqual(abs(div(2,3)),1)
复制代码

见执行后的结果:

 1.5请求唯一的临时目录

    在功能的测试中,也就是说在一个测试的包中,有N个测试模块,但是你只是想执行其中的一个模块,其它的模块不想执行,

那么就可以指定唯一的模块(测试套件)来进行执行,我如下的代码是我们写一个测试的函数,test_tmdir.py的源码为:

复制代码
#!/usr/bin/env python 
#-*-coding:utf-8-*-


def test_needsfiles(tmpdir):
    print tmpdir
    return 0
复制代码

执行该模块的代码,执行的命令是:pytest -q test_tmpdir.py,见执行后的结果输出:

二、用法和调用

2.1 调用pytest通过python -m pytest

   在新的版本中,我们可以python -m pytest来进行调用,比如:

python -m pytest ...

 

2.2 Possible Exit codes 

    运行pytest可能导致6种不同的退出执行的方式,分别是:

退出代码0成功地收集并传递了所有测试
退出代码1测试被收集和运行, 但一些测试失败
退出代码2测试执行被用户中断
退出代码3执行测试时发生内部错误
退出代码 4 pytest 命令行使用错误
退出代码5未收集任何测试

2.3 pytest信息的获

 显示从什么地方导入pytest

显示可用的内置函数参数

2.4分析测试执行持续时间

  我们编写一个模块,来执行该模块,看测试执行的时间,模块的代码是为:

#!/usr/bin/env python
from __future__ import unicode_literals
# -*- coding: utf-8 -*-

def test_answser():
    assert 3 in [3,4,5]

 

执行pytest --durations=10看持续执行的时间,见执行的截图:

2.5 创建JUnitXML 格式文件 

    我们通过pytest --junitxml=path可以创建junit xml的格式文件,执行命令成功后,在当前的目录下创建了path的文件夹,该文件夹中

生成了xml的文件,见执行的命令和执行命令后输出的结果信息:

见当前目录生成的path文件夹以及里面的内容:

 

2.6 创建 resultlog 格式文件 

   我们执行pytest --resultlog=path命令后,来查看执行的结果信息以查看path文件的内容,见执行命令后输出的内容:

path文件的内容是:

. test_unit.py::test_answser

 2.7 向在线pastebin服务发送测试报告

      为每个测试失败的创建一个url,执行的命令是:pytest --pastebin=failed,见执行命令后的截图:

为所有的测试创建url,执行的命令是:pytest --pastebin=all,见执行命令的截图:

在浏览器中访问https://bpaste.net/show/b47d4593b3d7地址,可以看到执行的结果信息,见截图:

我们使用selenium编写一个自动化的测试例子,来看看执行的结果信息,见编写的测试代码:

复制代码
#/usr/bin/env python
#coding:utf-8


def add(a,b):
    return a+b

lit1=[3,4,5,6]
def test_add():
    assert  add(2,3) in lit1

test_add()

import  unittest
from selenium import  webdriver


class WebTest(unittest.TestCase):
    def setUp(self):
        self.driver=webdriver.Firefox()
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)
        self.driver.get('http://www.bing.com')

    def test_bing_001(self):
        self.assertEqual(self.driver.title,u'微软 Bing 搜索 - 国内版')


    def test_bing_002(self):
        self.assertEqual(self.driver.current_url,'http://cn.bing.com/')

    def tearDown(self):
        self.driver.quit()
复制代码

 

再次执行pytest   --pastebin=all命令,看执行的结果信息,见如下的截图:

在浏览器中打开https://bpaste.net/show/2536d4e3bad2地址,见如下的截图信息:

2.8 禁用插件

    如果在使用中不想使用某些插件,可以使用如下的命令禁止使用该插件,命令为:

                                pytest -p no:doctest

2.9 在python代码中调用pytest

     在python的代码中,可以直接调用pytest,比如pytest.main(),我们把如上的代码做了修改,在该代码中加了

pytest的代码,见修改后的代码:

复制代码
#/usr/bin/env python
#coding:utf-8


def add(a,b):
    return a+b

lit1=[3,4,5,6]
def test_add():
    assert  add(2,3) in lit1

test_add()

import  unittest
from selenium import  webdriver


class WebTest(unittest.TestCase):
    def setUp(self):
        self.driver=webdriver.Firefox()
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)
        self.driver.get('http://www.bing.com')

    def test_bing_001(self):
        self.assertEqual(self.driver.title,u'微软 Bing 搜索 - 国内版')


    def test_bing_002(self):
        self.assertEqual(self.driver.current_url,'http://cn.bing.com/')

    def tearDown(self):
        self.driver.quit()

import  pytest

pytest.main()
复制代码

 

然后执行该代码,见执行后输出的内容:

复制代码
C:Python27python.exe "D:Program FilesJetBrainsPyCharm 2017.1.5helperspycharm_jb_unittest_runner.py" --path D:/git/Python/xUnit/test_unit.py
Testing started at 11:01 ...
Launching unittests with arguments python -m unittest discover -s D:/git/Python/xUnit -p test_unit.py -t D:gitPythonxUnit in D:gitPythonxUnit
============================= test session starts =============================
platform win32 -- Python 2.7.11, pytest-3.2.2, py-1.4.34, pluggy-0.4.0
rootdir: D:gitPythonxUnit, inifile:
plugins: allure-adaptor-1.7.8
collected 3 items

test_unit.py ...

========================== 3 passed in 14.51 seconds ==========================





Ran 2 tests in 15.069s

OK


Process finished with exit code 0
复制代码

 

我们也可以在pytest.main()中加入参数,来看它的执行结果比如我们创建一个模块,编写如下的代码,来看执行的结果,见代码:

复制代码
#!/usr/bin/env python 
#-*- coding:utf-8 -*-

import  pytest

class MyPlugin(object):

    def pytest_sessionfinish(self):
        print '***test run reporting finish'

pytest.main(['-qq'],plugins=[MyPlugin()])
复制代码

 

见执行该代码后的结果信息:

C:P
                        
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/yyang3121/article/details/80624168
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 21:07:54
  • 阅读 ( 1036 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢