使用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 创建第一个项目 本章我们将介绍Django 管理工具及如何使用 Django 来创建项目,第一个项目我们以 HelloWorld 来命令项目。   Django 管理工具 安装 Django 之后,您现在应该已经有了可用的管理工具 django-admin.py。我们可以使用 django-admin.py 来创建一个…

    Django 2023年4月9日
    00
  • Django如何重设Admin密码

    django设置用户是python manage.py createsuperuser,但是如果忘记密码,那么应该进入shell环境 下修改 python manage.py shell   from django.contrib.auth.models import User user = User.objects.get(username=’admin’…

    Django 2023年4月11日
    00
  • django-django的六种缓存设置

    参考博客:https://www.cnblogs.com/xiaonq/p/7978402.html#i6 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显 缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作 而是直接从内存或者Redis…

    Django 2023年4月11日
    00
  • Django多数据库配置及逆向生成model教程

    Django是流行的Web框架之一,它可以简化开发Web应用的过程。在实际项目中,我们可能需要使用多个数据库或者使用反向工程来自动生成模型代码。下面是Django多数据库配置及逆向生成model的完整攻略,包含两条示例说明。 配置多个数据库 Django默认只配置一个数据库,但是我们可以通过在settings.py中添加多个数据库配置来实现多个数据库的支持。…

    Django 2023年5月15日
    00
  • python框架django中结合vue进行前后端分离

    使用Python框架Django和JavaScript框架Vue结合进行前后端分离,能够提高开发效率,优化代码结构和分工。下面是一个详细的攻略,分为两个示例说明。 示例一:前后端分离项目创建 1. 创建Django项目 使用Django的脚手架 django-admin 可以快速创建一个Django项目,命令如下: django-admin startpro…

    Django 2023年5月16日
    00
  • Django与MVC

    Django是遵循MVC设计模式的一个框架:MVC(Model,View,Controller);模型,视图,控制器:如图: Django其实是一个MTV的模型:(Model,Template,VIew)模型,模板,视图  

    2023年4月9日
    00
  • Django 常用字段和参数

    一.ORM字段 类型 说明 AutoField 一个自动增加的整数类型字段。通常你不需要自己编写它,Django会自动帮你添加字段:`id = models.AutoField(primary_key=True)`,这是一个自增字段,从1开始计数。如果你非要自己设置主键,那么请务必将字段设置为`primary_key=True`。Django在一个模型中只允…

    Django 2023年4月10日
    00
  • Apache部署Django项目图文详解

    下面是详细讲解“Apache部署Django项目图文详解”的完整攻略。 1. 安装Apache和mod_wsgi模块 在Ubuntu系统中可以通过以下命令来安装Apache Web服务器: sudo apt-get update sudo apt-get install apache2 在安装Apache后,我们需要安装mod_wsgi模块来支持Django…

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