django

Django 1.6 测试框架

我先看完了官方教程的 tutorial05,感觉对于一直“裸码”的我,简直是发现新大陆。然后在这里记录一下所得:

首先关于测试: 1. 测试其实用不用框架我们一直都在做,只是方法很零散,很不规范,测试完就算了,而且没有一个维持性,今天测试过明天改了代码,今天的努力就白费了; 2. 如果使用单元测试框架,我们可以持续地增加测试,然后定期运行测试,一方面可以使得代码逻辑更清晰,有一个累积性,另一方面可以切实提高软件的质量; 3. 测试越多越好,随着代码的编写,测试应该越来越多,甚至多于本身的代码;然后随时运行测试,会很好地提高工作效率以及控制软件质量;

然后,如果需要使用 django 的测试功能,这是下面的几个步骤:

1. 在 app 的 test.py 里面导入 TestCase 类,然后再定义一个派生测试类

from django.test import TestCase class ModelMethodTest(TestCase): def test_method_behavior(self): ... self.assertEqual(var1, var2) self.assertContians(text, pattern) self.assertQuerysetEqual(set1, set2) 大概采用这种方式,在 TestCase 类里面以 test 开头的方法会被测试,然后通过各种 assert 来进行测试;如果 assert 的条件不符合了,测试就会失败,否则测试会通过;

2. 运行测试

在 shell 中执行:

python manage.py test [app_name]

然后 django 会自动创建一个数据库来存放测试数据; 对于每一个测试方法,django 先清空数据库,然后运行测试,如果有断言不成立则输出错误结果; 最终所有测试完毕之后,django 就删除测试的数据库;

3. 针对视图的测试

django 还可以针对视图进行方便的单元测试,但是需要用到一个虚拟的客户端; TestCase 类里面就内嵌有 client,如果想手动测试 client 的话需要在 shell 里面开启: >>> from django.test.utils import setup_test_environment

setup_test_environment() from django.test.client import Client client = Client() 这样就创建了一个测试用的客户端; 然后可以这样来使用: # 获取网页 response = client.get('/')

检查响应码

response.status_code

获取响应内容

response.content

如果是在 TestCase 类里面去调用 client,可以这样做: class MyTestCase(TestCase): def my_test_method(self): # 通过 client 获取 url response = self.client.get(reverse('namespace:urlname'), args=(...)) self.assertEqual(response.status_code, 200) self.assertContains(response, 'Hello world!'[, status_code=200]) self.assertQuerysetEqual( response.context['context_name'], [...] )

可以看到,直接使用 TestCase 基类的 client 对象就可以像在视图里面一样去获取 reverse url 的视图内容,传入参数,然后通过各种 assert 断言来进行测试的验证。

总而言之,尽快掌握 django 的测试框架并且多多写测试,有百利而无一害。这可以让软件质量再上一个档次,也充分体现了 django 框架的价值。

【转载请附】愿以此功德,回向 >>

原文链接:https://www.huangwenchao.com.cn/2014/03/django-test.html【Django 1.6 测试框架】

发表评论

电子邮件地址不会被公开。 必填项已用*标注