Python Pyramid 测试

Python Pyramid 测试

编写测试脚本以确保代码工作正确被视为良好的编程实践。Python生态系统中有许多测试框架,包括标准库中的 unittest 。而 Pytest 是一个流行的测试库,是Pyramid项目的首选库。

在演示 PasteDeploy 配置的使用时,我们将使用之前开发的hello包。

首先确保Pyramid环境中已安装 PyTest 软件包。

pip3 install pytest

在hello package中打开 setup.py 文件,并通过添加粗体显示的行来修改它。

from setuptools import setup

requires = [
   'pyramid',
   'waitress',
]
dev_requires = ['pytest',]
setup(
   name='hello',
   install_requires=requires,
   extras_require={
      'dev': dev_requires,
   },
   entry_points={
      'paste.app_factory': [
         'main = hello:main'
      ],
   },
)

每当使用以下命令安装(或重新安装)时,将Pytest添加为项目依赖项-

pip3 install -e ".[dev]

将下面的Python代码保存为hello包中的testing.py文件。

import unittest
from pyramid import testing
class HelloTests(unittest.TestCase):
   def test_hello_world(self):
      from . import hello_world
      request = testing.DummyRequest()
      response = hello_world(request)
      self.assertEqual(response.status_code, 200)

要运行测试,请使用以下Pytest命令。测试的输出如下所示−

Env\hello>pytest tests.py
========================== test session starts ==========================
platform win32 -- Python 3.10.1, pytest-7.1.2, pluggy-1.0.0
rootdir: E:\tp-pyramid\hello
collected 1 item

tests.py.
   [100%]

=========================== 1 passed in 1.12s ===========================

为了检查测试是否失败,请在测试函数中引入一个错误并再次运行。

(tp-pyramid) E:\tp-pyramid\hello>pytest tests.py
========================== test session starts ==========================
collected 1 item

tests.py F 
[100%]
=============================== FAILURES ================================
______________________ HelloTests.test_hello_world ______________________
self = <hello.tests.HelloTests testMethod=test_hello_world>
   def test_hello_world(self):
      from . import hello_world
      request = testing.DummyRequest()
      response = hello_world(request)
>     self.assertEqual(response.status_code, 404)
E     AssertionError: 200 != 404

tests.py:13: AssertionError
======================== short test summary info ========================
FAILED tests.py::HelloTests::test_hello_world - AssertionError: 200 != 404
=========================== 1 failed in 1.53s ===========================

功能测试

尽管单元测试在测试驱动开发(TDD)中被广泛应用于web应用程序,但 WebTest 是一个用于Python的功能测试包。我们可以模拟与WSGI应用程序的完整HTTP请求,然后测试响应中的信息。

示例

让我们使用之前的示例中使用过的hello项目。打开setup.py并将WebTest添加为项目依赖。

from setuptools import setup

requires = [
   'pyramid',
   'waitress',
]
dev_requires = ['pytest','webtest',]
setup(
   name='hello',
   install_requires=requires,
   extras_require={
      'dev': dev_requires,
   },
   entry_points={
      'paste.app_factory': [
         'main = hello:main'
      ],
   },
)

重新安装hello包和其新的开发模式依赖项。

Env\hello>..\scripts\pip3 install -e ".[dev]"

tests.py 文件中包含一个功能测试

import unittest
from pyramid import testing

class HelloTests(unittest.TestCase):

   def test_hello_world(self):
      from . import hello_world
      request = testing.DummyRequest()
      response = hello_world(request)
      self.assertEqual(response.status_code, 200)
class HelloFunctionalTests(unittest.TestCase):
   def setUp(self):
      from . import main
      app = main({})
      from webtest import TestApp
      self.testapp = TestApp(app)
   def test_hello_world(self):
      res = self.testapp.get('/', status=200)
      self.assertIn(b'<h1>Hello World!</h1>', res.body)

输出

最后按照以下命令运行Pytest:

Env\hello>pytest tests.py
========================== test session starts ==========================
platform win32 -- Python 3.10.1, pytest-7.1.2, pluggy-1.0.0
rootdir: E:\tp-pyramid\hello
collected 2 items
tests.py .. [100%]

=========================== 2 passed in 2.37s ===========================

Cookiecutter项目中的测试

CookieCutter工具会自动生成包含功能测试和单元测试的tests包。我们之前使用CookieCutter构建了一个名为testproj的Pyramid项目。在这个项目中,我们可以找到tests文件夹。

示例

test_functional.py包含了以下测试函数 –

from testproj import models

def test_my_view_success(testapp, dbsession):
   model = models.MyModel(name='one', value=55)
   dbsession.add(model)
   dbsession.flush()
   res = testapp.get('/', status=200)
   assert res.body

def test_notfound(testapp):
   res = testapp.get('/badurl', status=404)
   assert res.status_code == 404

The test_views.py文件定义了以下测试函数来测试视图-

from testproj import models
from testproj.views.default import my_view
from testproj.views.notfound import notfound_view

def test_my_view_failure(app_request):
info = my_view(app_request)
assert info.status_int == 500

def test_my_view_success(app_request, dbsession):
   model = models.MyModel(name='one', value=55)
   dbsession.add(model)
   dbsession.flush()
   info = my_view(app_request)
   assert app_request.response.status_int == 200
   assert info['one'].name == 'one'
   assert info['project'] == 'testproj'
def test_notfound_view(app_request):
   info = notfound_view(app_request)
   assert app_request.response.status_int == 404
   assert info == {}

输出

这些测试由以下命令运行 –

Env\testproj>Pytest
========================== test session starts ==========================
platform win32 -- Python 3.10.1, pytest-7.1.2, pluggy-1.0.0
rootdir: Env\testproj, configfile: pytest.ini, testpaths: testproj, tests
plugins: cov-3.0.0
collected 5 items

tests\test_functional.py .. [ 40%]
tests\test_views.py ... [100%]
=============== 5 passed, 20 warnings in 6.66s ===============

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程