Pruebas automatizadas Django First APP y la introducción de archivos estáticos

Notas de estudio personal, consulte la documentación oficial de Django: https://docs.djangoproject.com/zh-hans/3.2/
Este artículo está publicado en mi blog personal: https://sunguoqi.com/2021/12/10/ Django_02 /

1. Pruebas automatizadas

  Probar tu código es comprobar que tu código funciona (tonterías)

  Para ser honesto, hasta ahora, escribí el programa para ejecutar --> informar un error --> luego leer el mensaje de error --> printentrada y salida para probarlo. Pero el proyecto es un proyecto completo después de todo, por lo que la prueba es demasiado poco profesional.

  Las pruebas automatizadas tienen las siguientes ventajas:

  • Las pruebas le ahorrarán tiempo
  • Las pruebas no solo encuentran errores, sino que los previenen
  • Las pruebas hacen que su código sea más atractivo
  • Las pruebas facilitan el trabajo en equipo

Suena bien, ¡entonces pruébalo!

1. Primero, debe haber un error

  Siguiendo esta lógica de aplicación que escribimos anteriormente, cuando visitemos indexesta página, deberíamos obtener los cinco votos publicados más recientemente, si es que hay cinco.

  Pero ahora hay un pequeño error de que si nuestro voto está programado para ser publicado mañana, nuestra idea es que los usuarios solo puedan ver este voto mañana, la indexpágina no debería mostrar estos datos, pero de acuerdo con la lógica actual, indexse mostrará de inmediato. .Datos del artículo.

  注意: La descripción anterior es de hecho un error, pero hay otro error importante, es decir, cuando escribimos el modelo de datos antes, no definimos ningún método para mostrar los datos dentro de un día. Perdóneme por no ver este requisito: la pregunta se publicó en un día.

A continuación se muestra el estado actual de la capa del modelo.

# django框架的接口模块,默认已经引入
from django.db import models

import datetime
from django.utils import timezone


# Create your models here.

# 创建了一个“问题”类(表),表里有两个字段。
class Question(models.Model):
    # 问题描述字段
    question_text = models.CharField(max_length=200)
    # 创建日期字段
    pub_date = models.DateTimeField('date published')

    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

    # python魔法方法,显示调用该对象的时候的返回内容
    def __str__(self):
        return self.question_text


# 创建了一个选项类(表),表中包含三个字段。
class Choice(models.Model):
    # 这个表里定义了一个外键字段,因为一个问题可以有多个选项,每个问题对应每个问题的选项。
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    # 选项描述字段
    choice_text = models.CharField(max_length=200)
    # 是否选取字段
    votes = models.IntegerField(default=0)

    # python魔法方法,显示调用该对象的时候的返回内容
    def __str__(self):
        return self.choice_text

2. Exponga este error

  La descripción del texto de este ERROR es un poco pálida. Usemos el comando pythonmanage.pyshell para exponer este ERROR.

  Abra la terminal en el directorio raíz del proyecto e ingrese python manage.py shellal entorno de compilación interactivo.

>>> import datetime
>>> from django.utils import timezone
>>> from polls.models import Question
>>> # 创建了一个实例对象,他的时间是未来的。
>>> future_question = Question(pub_date=timezone.now() + datetime.timedelta(days=30))
>>> # 会公开近期投票吗?
>>> future_question.was_published_recently()
True

  Obviamente, ahora la aplicación abrirá votaciones futuras, por lo que tenemos que corregir este error, claro, esto no es una prueba automática, solo lo estamos probando en un entorno interactivo, debemos escribirlo en un archivo, cuando se ejecuta el proyecto, Ejecutar pruebas automatizadas.

3. Pruebas automatizadas

  Por convención, las pruebas para aplicaciones Django deben escribirse en los tests.pyarchivos . El sistema de prueba encontrará y ejecutará automáticamente el código de prueba en todos los archivos que testscomiencen con .

polls/tests.py

# Django自带的测试接口,默认已经引入
from django.test import TestCase
# Create your tests here.
# 引入datatime模块
import datetime
from django.utils import timezone
# 引入我们的数据表
from .models import Question


class QuestionModelTests(TestCase):

    def test_was_published_recently_with_future_question(self):
        """
        未来的一个时间他的返回值应该是False
        """
        time = timezone.now() + datetime.timedelta(days=30)
        future_question = Question(pub_date=time)
        self.assertIs(future_question.was_published_recently(), False)

4. Ejecute la prueba

  Ejecutar comando de prueba en la terminalpython manage.py test polls

PS J:\study_django\mysite> python manage.py test polls
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
E
======================================================================
ERROR: test_was_published_recently_with_future_question (polls.tests.QuestionModelTests)
未来的一个时间他的返回值应该是False
----------------------------------------------------------------------
Traceback (most recent call last):
  File "J:\study_django\mysite\polls\tests.py", line 19, in test_was_published_recently_with_future_question
    self.assertIs(future_question.was_published_recently(), False)
AttributeError: 'Question' object has no attribute 'was_published_recently'

----------------------------------------------------------------------
Ran 1 test in 0.003s

FAILED (errors=1)
Destroying test database for alias 'default'...
PS J:\study_django\mysite>

  Así es como se ejecuta la prueba automatizada:

  • python manage.py test pollsbuscará el código de prueba en la pollsaplicación

  • Encontró una subclase de django.test.TestCase

  • Crea una base de datos especial para pruebas de uso

  • Busca métodos de prueba en los métodos de clase que testcomienzan con .

  • En el test_was_published_recently_with_future_questionmétodo , crea una instanciapub_date con un valor de 30 días después .Question

  • Luego use el assertls()método y descubra que was_published_recently()regresa True, y esperamos que regrese False.

5. Solucione este error

Debe ser devuelto   cuando pub_datees una fecha futura . Modifique el método para que solo regrese si la fecha está en tiempo pasado :Question.was_published_recently()Falsemodels.pyTrue

polls/models.py

...
def was_published_recently(self):
    now = timezone.now()
    return now - datetime.timedelta(days=1) <= self.pub_date <= now
...

6. Pruebas más exhaustivas

  Lo mejor es probar el pasado, lo reciente y el futuro. Así que modifique el código de prueba de la siguiente manera.

# Django自带的测试接口,默认已经引入
from django.test import TestCase
# Create your tests here.
# 引入datatime模块
import datetime
from django.utils import timezone
# 引入我们的数据表
from .models import Question


class QuestionModelTests(TestCase):

    def test_was_published_recently_with_future_question(self):
        """
        未来的一个时间他的返回值应该是False
        """
        time = timezone.now() + datetime.timedelta(days=30)
        future_question = Question(pub_date=time)
        self.assertIs(future_question.was_published_recently(), False)

    def test_was_published_recently_with_old_question(self):
        """
        最近一天的
        """
        time = timezone.now() - datetime.timedelta(days=1, seconds=1)
        old_question = Question(pub_date=time)
        self.assertIs(old_question.was_published_recently(), False)

    def test_was_published_recently_with_recent_question(self):
        """
        过去的
        """
        time = timezone.now() - datetime.timedelta(hours=23, minutes=59, seconds=59)
        recent_question = Question(pub_date=time)
        self.assertIs(recent_question.was_published_recently(), True)

7. Otras soluciones

  Otra solución es que no deberíamos mostrar los votos futuros, luego deberíamos filtrarlos cuando se muestre la vista 过去y 未来no he seguido estudiando esto.

En segundo lugar, la introducción de archivos estáticos.

  Primero polls, cree un directorio llamado debajo staticdel directorio. Django buscará en este directorio archivos estáticos, de forma similar a como Diango busca plantillas en el polls/templates/directorio .

1. Crea un nuevo estilo css

Cree un nuevo estilo en el directorio de archivos estáticos.

static/style.css

li a {
    
    
  color: green;
}

2. Introducir archivos estáticos

Introducir archivos estáticos en plantillas.

index.html

{% load static %}

<link rel="stylesheet" type="text/css" href="{% static 'style.css' %}" />

3. Ejecutar el proyecto

Supongo que te gusta

Origin blog.csdn.net/weixin_50915462/article/details/121866880
Recomendado
Clasificación