使用Django+Pytest搭建在线自动化测试平台

下面我将为您详细讲解使用Django+Pytest搭建在线自动化测试平台的完整攻略,并提供两条示例说明。

概述

首先,让我们来了解一下Django和Pytest。

Django是一个基于Python的Web框架,它采用了MVC结构,并提供了一系列的工具和API,使得开发Web应用变得更加简单和快速。

Pytest则是一种Python的测试框架,其支持多种类型的测试,并具有简单易用、编写测试用例简单等特点。同时,它也支持自定义的插件,例如html测试报告等。

使用Django和Pytest搭建在线自动化测试平台,可以方便地管理测试用例、执行测试、查看测试报告等。

操作步骤

接下来,我们将分为以下步骤来讲解如何使用Django+Pytest搭建在线自动化测试平台。

  1. 创建Django项目和测试框架

首先,我们需要在本地创建一个Django项目,并安装pytest和pytest-django包。

# 创建Django项目
$ django-admin startproject mysite

# 创建测试应用
$ python manage.py startapp testapp

# 安装pytest和pytest-django包
$ pip install pytest pytest-django
  1. 编写测试用例

在testapp目录下,我们需要创建一个tests.py文件来编写测试用例,例如:

import pytest

@pytest.mark.django_db
def test_addition():
  assert 1 + 1 == 2
  1. 执行测试用例

在项目根目录下,执行以下命令来执行测试用例:

$ pytest

我们可以使用pytest-html插件来生成html格式的测试报告:

$ pytest --html=report.html
  1. 集成到Django项目中

我们需要在Django项目中,集成pytest框架。在mysite/settings.py文件中添加以下代码:

# 告诉Django使用pytest作为测试框架
TEST_RUNNER = 'pytest_django.runner.DiscoverRunner'

# 告诉pytest在哪个目录下查找测试用例
pytest_configure = 'src/apps/testapp/tests.py'

在mysite/urls.py文件中添加以下代码:

from django.urls import path
from django.views.generic import TemplateView

urlpatterns = [
    path('', TemplateView.as_view(template_name='index.html')),
    path('run_tests/', TemplateView.as_view(template_name='run_tests.html')),
]

然后在testapp目录下,创建一个urls.py文件,并添加以下代码:

from django.urls import path
from .views import run_tests

urlpatterns = [
    path('', run_tests),
]

我们需要在testapp目录下创建一个views.py文件,并添加以下代码:

from django.shortcuts import render
from django.test.utils import override_settings
from mysite.settings import pytest_configure

# Decorator to set pytest configuration
# from Django Settings
@override_settings(
    ROOT_URLCONF=pytest_configure
)
def run_tests(request):
    results = []

    # Required for multiprocess
    # see: https://github.com/pytest-dev/pytest-django/issues/269
    if request.GET.get("processes"):
        import django
        django.setup()

    # Run tests with pytest
    import pytest
    pytest.main([
        '-s', '-vvv',
        requested_groups.join(',') ,
        '--html', 'tests_report.html',
        ])
    return render(request, 'run_tests.html', context={
            'results': results
        })
  1. 创建前端页面

我们需要在mysite/templates目录下,创建两个html文件:index.html和run_tests.html,并添加以下代码:

index.html:

<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>Test Platform</title>
  </head>
  <body>
    <h1>Test Platform</h1>
    <a href="{% url 'testapp:run_tests' %}">Run Tests</a>
    <p>Test Results:</p>
  </body>
</html>

run_tests.html:

<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>Test Results</title>
  </head>
  <body>
    <h1>Test Results</h1>
    {% if results %}
    <h2>Passed</h2>
    <table>
      <thead>
        <tr>
          <th>Test Name</th>
          <th>Execution Time</th>
        </tr>
      </thead>
      <tbody>
        {% for name, duration in results.passed %}
        <tr>
          <td>{{ name }}</td>
          <td>{{ duration }}</td>
        </tr>
        {% endfor %}
      </tbody>
    </table>
    {% endif %}

    {% if results %}
    <h2>Failed</h2>
    <table>
      <thead>
        <tr>
          <th>Test Name</th>
          <th>Error</th>
          <th>Execution Time</th>
        </tr>
      </thead>
      <tbody>
        {% for name, error, duration in results.failed %}
        <tr>
          <td>{{ name }}</td>
          <td>{{ error }}</td>
          <td>{{ duration }}</td>
        </tr>
        {% endfor %}
      </tbody>
    </table>
    {% endif %}

    {% if results %}
    <h2>Skip</h2>
    <table>
      <thead>
        <tr>
          <th>Test Name</th>
          <th>Reason</th>
        </tr>
      </thead>
      <tbody>
        {% for name, reason in results.skipped %}
        <tr>
          <td>{{ name }}</td>
          <td>{{ reason }}</td>
        </tr>
        {% endfor %}
      </tbody>
    </table>
    {% endif %}
    <br><br>
    <a href="/">Back to Home</a>
  </body>
</html>
  1. 运行测试平台

我们运行Django项目,然后打开浏览器,访问http://127.0.0.1:8000/,即可看到我们创建的前端页面。点击Run Tests,即可执行测试用例,并查看测试结果。

附加说明

下面我们提供两个示例,来进一步说明如何使用Django+Pytest搭建在线自动化测试平台。

示例1

我们假设我们的项目中有一个购物车功能。我们可以使用Django+Pytest来编写测试用例,例如:

from django.test import TestCase, Client
from .models import Product, User

class CartTestCase(TestCase):
    def setUp(self):
        # Create user and sign in
        self.client = Client()
        self.user = User.objects.create(username='testuser')
        self.client.force_login(self.user)

        # Create products
        self.product1 = Product.objects.create(name='Product1', price=100)
        self.product2 = Product.objects.create(name='Product2', price=200)

    def test_add_to_cart(self):
        # Add products to cart
        response = self.client.post('/add_to_cart/', {
            'product_id': self.product1.id,
            'quantity': 2
        })

        # Assert response status code
        self.assertEqual(response.status_code, 200)

        # Check if cart contains the added products
        response = self.client.get('/cart/')
        self.assertIn(str(self.product1), str(response.content))

    def test_remove_from_cart(self):
        # Add products to cart
        response = self.client.post('/add_to_cart/', {
            'product_id': self.product1.id,
            'quantity': 2
        })

        # Remove product from cart
        response = self.client.post('/remove_from_cart/', {
            'product_id': self.product1.id,
        })

        # Check if cart does not contain the removed product
        response = self.client.get('/cart/')
        self.assertNotIn(str(self.product1), str(response.content))

示例2

我们假设我们的项目中有一个用户管理功能。我们可以使用Django+Pytest来编写测试用例,例如:

from django.test import TestCase, Client
from .models import User

class UserTestCase(TestCase):
    def setUp(self):
        # Create user and sign in
        self.client = Client()
        self.user = User.objects.create(username='testuser')
        self.client.force_login(self.user)

    def test_user_creation(self):
        # Create user
        response = self.client.post('/create_user/', {
            'username': 'newuser',
            'email': 'newuser@example.com',
            'password1': 'password',
            'password2': 'password',
            'is_staff': False,
            'is_superuser': False
        })

        # Assert response status code
        self.assertEqual(response.status_code, 302)

        # Check if user was created
        user = User.objects.get(username='newuser')
        self.assertIsNotNone(user)

    def test_user_login(self):
        # Log out current user
        self.client.logout()

        # Log in new user
        response = self.client.post('/login/', {
            'username': 'newuser',
            'password': 'password'
        })

        # Assert response status code
        self.assertEqual(response.status_code, 302)

        # Check if user is logged in
        response = self.client.get('/')
        self.assertIn('newuser', str(response.content))

以上是使用Django+Pytest搭建在线自动化测试平台的完整攻略和示例。希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用Django+Pytest搭建在线自动化测试平台 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • django搭建项目配置环境和创建表过程详解

    下面是关于“django搭建项目配置环境和创建表过程详解”的完整攻略,其中会包含两个示例: 搭建环境 首先,您需要确保您的系统上已经安装了Python。如果没有,请从官方网站下载并安装对应版本的Python。 接下来,您需要安装Django。可以使用以下命令来安装Django: pip install django 安装完成后,您需要创建一个新的Django…

    Django 2023年5月16日
    00
  • django2.0无法加载外部css和js的问题

    解决问题的思路来源于https://www.v2ex.com/t/430192 先是创建static目录,该目录与manage.py同级 然后在项目settings.py文件里添加 STATICFILES_DIRS = ( os.path.join(BASE_DIR, ‘static’).replace(‘\\’, ‘/’),) INSTALLED_APPS…

    Django 2023年4月10日
    00
  • django-rest-framework框架 第四篇 认证Authentication

    认证Authentication 什么是身份认证 身份验证是将传入请求与一组标识凭据(例如请求来自的用户或与其签名的令牌)关联的机制。 视图的最开始处运行身份验证 在权限和限制检查发生之前,以及在允许继续执行任何其他代码之前,始终在视图的最开始处运行身份验证。 身份验证方案总是定义为类的列表 REST框架尝试对列表中的每个类进行身份验证,并将成功身份验证的第…

    Django 2023年4月11日
    00
  • Django笔记六之外键ForeignKey介绍

    这一篇笔记介绍 Django 系统 model 的外键处理,ForeignKey 以及相应的处理方法。 这是一种一对多的字段类型,表示两张表之间的关联关系。 本篇笔记的目录如下: on_delete related_name related_query_name 外键字段的保存 1、on_delete 假设有两个 application,app1 和 app…

    Django 2023年4月10日
    00
  • 新旧Django版本中urls与path的区别

    from django.conf.urls import url from . import view urlpatterns = [ url(r’^hello$’, view.hello),] 新版本2.0以上: from django.urls import path from . import view urlpatterns = [ path(‘he…

    Django 2023年4月16日
    00
  • 详解Python的Django框架中的模版相关知识

    详解Python的Django框架中的模版相关知识 Django 是一个优秀的 Python Web 框架,内置了强大的模版引擎,方便开发者快速创建 Web 应用。本文将详细讲解 Django 中与模版相关的知识,包括模版的语法、模版继承和自定义模版标签等内容。同时,本文将提供两个示例来说明 Django 模版相关知识的应用。 模版的语法 Django 模版…

    Django 2023年5月16日
    00
  • 【开源】最近写了一个简单的网址导航网站

    前言 随着团队的成长,要管理的项目或使用的内部系统越来越多,很多内部系统都没有域名,使用IP+端口,很难记。 为了解决这个痛点,我抽空写了个导航网站~ 目前用下来效果还不错,可以基本完美的解决这个问题。 项目名称是 SiteDirectory ,代码在 Github 开源了: https://github.com/Deali-Axy/SiteDirector…

    2023年4月10日
    00
  • Django【性能提升篇】

    数据库部分 一、查询优化 二、持久化数据库连接   django1.6以后已经内置了数据库持久化连接,很多人使用PostgreSQL作为它们的线上数据库系统,而当我们连接PostgreSQL有时会显得很慢,这里我们可以进行优化。  没有持久化连接,每一个网站的请求都会与数据库建立一个连接。如果数据库不在本地,尽管网速很快,这也将花费20-75ms.   设置…

    Django 2023年4月12日
    00
合作推广
合作推广
分享本页
返回顶部