Django Web 测试

Django 单元测试

模拟浏览器发起请求,测试 web 功能。只是简单记录一下怎么使用。

环境

Win10
Python2.7
Django 1.8.11
MySQL5.6

项目结构

大致如下

mysite
  mysite
    settings.py
    urls.py
    views.py
    ...
  templates
    ...

测试

创建 mysite/mysite/tests.py
也可以放在 mysite/tests.py (项目目录下)
也可以放在 myapp/tests.py (应用目录下)

# -*- coding: utf-8 -*-

from django.test import Client, TestCase

class LittleTestCase(TestCase):
    def setUp(self):
        """
        测试前置任务,创建一个客户端,可以把它看做浏览器。
        """
        self.click = Client()

    def test_http_response_status(self):
        """
        请求根目录,验证响应码
        """
        response = self.client.get('/')
        self.assertEqual(response.status_code, 200)

    def test_http_response_content(self):
        """
        请求 /get_json/,验证返回 JSON 数据。
        """
        response = self.client.get('/get_json/')
        self.assertEqual(response.content, '{"msg": "success"}')

    def test_http_response_context(self):
        """
        请求 /hello/,验证上下文,也就是渲染视图的数据
        """
        data = {
            "name": "jack"
        }
        response = self.client.get('/hello/', data)
        self.assertEqual(response.context["name"], "jack123")

执行测试
Django 找到 test*.py 文件中的 TestCase 子类,进行测试

python manage.py test

如果 tests.py 放在自己创建的目录中,如 mysite/tests/tests.py,执行测试要指定目录

python manage.py test tests/

测试结果
执行了3个测试,全部成功
需要注意,Django 默认创建一个 test_ 开头的数据库执行测试,测试结束会自动销毁这个数据库。

Creating test database for alias 'default'...
...
----------------------------------------------------------------------
Ran 3 tests in 0.533s

OK
Destroying test database for alias 'default'...

项目代码

mysite/mysite/urls.py

# -*- coding: utf-8 -*-

from django.conf.urls import include, url
from django.contrib import admin
from django.views.generic import TemplateView
from mysite import views
urlpatterns = [
    url(r'^$', views.index),
    url(r'^get_json/$', views.get_json),
    url(r'^hello/$', views.hello),
]

mysite/mysite/views.py

# -*- coding: utf-8 -*-

import json
from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return render(request, 'mysite/index.html')

def get_json(request):
    result = {
        "msg": "success",
    }
    return HttpResponse(json.dumps(result), content_type="application/json")

def hello(request):
    name = request.GET.get('name')
    data = {
        "name": name + "123"
    }
    return render(request, 'mysite/hello.html', data)

posted @ 2019-05-07 11:08  吴思老  阅读(289)  评论(0编辑  收藏  举报