Py学习  »  Django

[Django] 测试数据生成

alue • 2 年前 • 234 次点击  

为一个模型生成大量mock数据,方便开发测试性能。

我们的模型字段定义如下:

class Document(models.Model):
    # 档案
    date = models.DateField("收文日期")
    number = models.CharField("发文字号", max_length=128)
    kind = models.CharField("公文种类", max_length=32)
    title = models.CharField("标题", max_length=256)
    pages = models.PositiveSmallIntegerField("页数", default=1)
    department = models.ForeignKey(
        to="user.Department",
        verbose_name="发往单位",
        null=True,
        blank=True,
        on_delete=models.SET_NULL
    )

如何快速生成大量的测试数据呢?方法有很多,这里提供我常用的方式如下。 这里涉及的知识点有

  • python多线程
  • request库获取一段随机中文API的数据 "https://api.ixiaowai.cn/api/ylapi.php"
  • 独立Django环境的运行方式 os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings' django.setup()
  • 随机数据的方法。
import os
import random
import threading
import time
from datetime import datetime

import django
import requests

os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'

django.setup()

from user.models import Department
from public_api.models import Document

COUNT = 1000
URL = "https://api.ixiaowai.cn/api/ylapi.php"
DEPARTMENT_SET = Department.objects.filter(depth=2).values_list("id", flat=True)


def get_random_department_id():
    return DEPARTMENT_SET[random.randint(0, DEPARTMENT_SET.count() - 1)]


def get_random_document():
    Document.objects.create(
        date=f"20{str(random.random())[2:4]}-{random.randint(1, 12)}-{random.randint(1, 28)}",
        number="字" + str(random.random())[2:],
        kind="种类" + str(random.random())[3],
        title=requests.get(URL).text[:20],
        pages=random.randint(1, 100),
        department_id=get_random_department_id()
    )


def gen_document(count):
    for i in range(count):
        get_random_document()
        time.sleep(1)


if __name__ == "__main__":
    t1 = threading.Thread(target=gen_document, args=(1000,))
    t2 = threading.Thread(target=gen_document, args=(1000,))
    t3 = threading.Thread(target=gen_document, args=(1000,))
    t4 = threading.Thread(target=gen_document, args=(1000,))
    t1.start()
    t2.start()
    t3.start()
    t4.start()
    t1.join()
    t2.join()
    t3.join()
    t4.join()


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/122534
 
234 次点击