Django单元测试

Django单元测试简介

  • Django的单元测试使用python的unittest模块,这个模块使用基于类的方法来定义测试。类名为django.test.TestCase,继承于python的unittest.TestCase。
  • 对于每一个测试方法都会将setUp()和tearDown()方法执行一遍。
  • 会单独新建一个测试数据库来进行数据库的操作方面的测试,默认在测试完成后销毁。
  • 在测试方法中对数据库进行增删操作,最后都会被清除。也就是说,在test_add中插入的数据,在test_add测试结束后插入的数据会被清除。
  • django单元测试时为了模拟生产环境,会修改settings中的变量,例如, 把DEBUG变量修改为True, 把ALLOWED_HOSTS修改为[*]。

运行单元测试

  • 在目录下运行如下指令,即可运行单元测试。
   python manage.py test 
  • 运行测试的时候,测试程序会在所有以test开头的文件中查找所有的test cases(inittest.TestCase的子类),自动建立测试集然后运行测试。
  • 在单元测试中,可以指定测试粒度。这样可以专注于只测试还没测试的单元测试,而已经测试过的就不测试了。

范例

#学号绑定
class bindTest(TestCase):
    #初始化
    def setUp(self):
        User.objects.create(open_id='id1', student_id='2016012072')
        User.objects.create(open_id='id2',student_id='')
        User.objects.create(open_id='id3',student_id='')
    
    #获取当前用户的学号绑定状态
    def test_usertest_get(self):
        c = Client()
        response = c.get('/api/u/user/bind/?',{"openid":"id1"})
        self.assertEqual(response.json()['data'],"2016012072")

    #未绑定用户的测试
    def test_usertest_get_none(self):
        c = Client()
        response = c.get('/api/u/user/bind/?',{"openid":"id2"})
        self.assertEqual(response.json()['data'],"")


    #将当前用户绑定至指定学号
    def test_usertest_post(self):
        User_bind = UserBind()
        User_bind.input = {
            'openid':'id2',
            'student_id':'2016010000',
            'password':'123456test'
        }
        User_bind.post()
        self.assertEqual(User.get_by_openid('id2').student_id, '2016010000')

    #对已绑定的用户进行重复绑定
    def test_usertest_post_wrong_studentid(self):
        User_bind = UserBind()
        User_bind.input = {
            'openid':'id2',
            'student_id':'2016010002',
            'password':'123456test'
        }
        User_bind.post()
        self.assertEqual(User.get_by_openid('id2').student_id, '2016010002')

注意事项:

单元测试中,用来初始化的函数必须命名为setUp(),用来测试的函数必须命名为test_xxx()的格式。

单元测试的等级

  • 正常流程可用,即一个函数在输入正确的参数时,会有正确的输出
  • 异常流程可抛出逻辑异常,即输入参数有误时,不能抛出系统异常,而是用自己定义的逻辑异常通知上层调用代码其错误之处
  • 极端情况和边界数据可用,对输入参数的边界情况也要单独测试,确保输出是正确有效的
  • 所有分支、循环的逻辑走通,不能有任何流程是测试不到的
  • 输出数据的所有字段验证,对有复杂数据结构的输出,确保每个字段都是正确的地方

参考资料

猜你喜欢

转载自blog.csdn.net/qq_40089232/article/details/83217020