zoukankan      html  css  js  c++  java
  • Django单元测试二三事

    零、前言

    之前做过一个微信公众平台的开发者后台,功能比较简单,我个人也比较懒,所以就没有写测试。前段时间更新了一下版本,对代码进行了改动。结果昨天收到消息说后台出问题了,一个功能无法使用。我检查了半天,发现是上次更新时候和那个功能有关的数据库不小心删掉了。。。导致功能无法使用。

    今天修复了错误之后,痛下决心决定写个测试,保证以后不会出这样弱智的问题。

    一、用什么测试

    我使用的框架是Django,所以第一反应就是去官网查文档。Django自身带测试功能,封装了Python的unittest,并且提供了连接其他测试框架的API。

    简单看了一下介绍,发现Django自带功能已经够用了,就不用其他框架了。

    二、迅速上手

    来看官方的两个小例子:

    第一个:

     1 from django.test import TestCase
     2 from myapp.models import Animal
     3 
     4 class AnimalTestCase(TestCase):
     5     def setUp(self):
     6         Animal.objects.create(name="lion", sound="roar")
     7         Animal.objects.create(name="cat", sound="meow")
     8 
     9     def test_animals_can_speak(self):
    10         """Animals that can speak are correctly identified"""
    11         lion = Animal.objects.get(name="lion")
    12         cat = Animal.objects.get(name="cat")
    13         self.assertEqual(lion.speak(), 'The lion says "roar"')
    14         self.assertEqual(cat.speak(), 'The cat says "meow"')

    第二个:

    1 >>> from django.test import Client
    2 >>> c = Client()
    3 >>> response = c.post('/login/', {'username': 'john', 'password': 'smith'})
    4 >>> response.status_code
    5 200
    6 >>> response = c.get('/customer/details/')
    7 >>> response.content
    8 '<!DOCTYPE html...'

    OK,看出来什么名堂了吗?

    其实就我个人的感觉来说,这两个小例子足以讲清楚Django测试的方法了。

    第一个例子,是测试model的,可以创建model并调用model的方法。

    第二个例子,是测试view的,可以模拟客户的请求,并对返回的结果进行判断。

    几点注意事项:

    • Django的测试不会影响项目自身数据库,而是新建一个数据库,并在测试结束之后删除这个数据库。所以请不要担心项目数据的安全。并且,因为是新建的数据库,所以需要在setUp方法中先填充数据,不然是什么都查询不到的哦。看了一眼输出,貌似提供了fixtures,也就是说可以把测试用的数据写入一个fixture文件,然后会在测试开始时把这个文件导入数据库中。不过由于我的测试很小,所以就手动创建数据了。
    • 模拟用户的POST请求,默认是关闭CSRF的,如果想开启的话可以加参数。
      csrf_client = Client(enforce_csrf_checks=True)
    • 模拟请求要用相对路径
    • 只能请求本项目,不能对其他网站进行访问。很遗憾。。。。如果能的话可以当做一个headless browser来用了
    • 测试时候不用runserver,可以直接测试,加快速度

    三、我遇到的问题

    遇到了两个问题,简单描述一下。

    第一个是文件命名问题,官方给的是test*.py,我就创建了一个test.py,结果死活用不了。后来发现app的文件夹里有一个tests.py,把测试代码放到这个里就可以用了。

    第二个是中文问题。我的model需要一个中文的name域,但是用Vim编辑tests.py时候,输入中文就变成乱码,复制粘贴也不行。后来想到一个曲线救国的方法,既然不能写入中文那就写中文对应的unicode码,然后在字符串前面加一个u强制使用unicode编码,试了一下果然可以。

    要想获得中文对应的unicode码,可以这样:

    >>> print repr(u'哈哈')
    u'u54c8u54c8'

    然后把这个复制到tests.py文件里就可以了。

    四、总结

    我不喜欢长篇大论,也不喜欢复制粘贴,这篇文章主要是介绍一下Django的测试功能,并记录一下我遇到的问题。如果需要完整的介绍可以自己去官网查看,那比我写的好多了。

    总的来说Django的测试功能还是不错的,尤其是模拟用户请求,相当给力。

  • 相关阅读:
    C# Dictionary几种遍历方式
    Android 代码中文字在手机上显示乱码问题解决方法
    【Android学习5】Clean 之后R文件丢失
    【android学习4】Eclipse中Clean作用
    Java基础语法(练习)
    Java基础语法(自定义类、ArrayList集合)
    Java基础语法(方法)
    Java基础语法(数组)
    Java基础(Scanner、Random、流程控制语句)
    Java基础(变量、运算符)
  • 原文地址:https://www.cnblogs.com/numbbbbb/p/3428109.html
Copyright © 2011-2022 走看看