Django 自动化测试

Django 自动化测试

为什么要自动化测试

自动测试只需要在每次程序修改后,运行对应的测试文件,就可以自动的告诉你是否对原先功能产生影响。不同于之前的手动测试,自动化测试不需要手动的一次次输入测试用例,而且可以一次测试多个函数的多种输入。在实际的项目生产中,这种自动化测试是必不可少的。

自动化测试

python中自带unittest模块。编写单元测试时,我们需要编写一个测试类,从unittest.TestCase继承。

import unittest

Django中存在test类,同理python的unittest模块,可以进行自动测试。Django中每个APP下面有一个test.py,在里面编写测试代码,就可以进行自动化的测试

from django.test import TestCase

在测试的类中,以test开头的方法就是测试方法,不以test开头的方法不被认为是测试方法,测试的时候不会被执行。对每一类测试都需要编写一个名为test_xxx()方法。
拿一段代码来举例说明:

class AdminLoginTest(TestCase):
    def setUp(self):
        User.objects.create_superuser(username='1',password='11111', email='[email protected]')       

    #url测试
    def test_login_url(self):
        c=Client()
        response=c.post('/api/a/login',{"username": "1", "password": "11111"})
        self.assertEqual(response.status_code,200)

比较简单的本地测试例子,在此就不赘述了,相关的参考资料很多。
大家可以参考:python 单元测试

因此我只来简单介绍一下上面写的,用代码访问网址获取数据测试的方法
我们可以用 django.test.Client 的实例来实现 get 或 post 内容,检查一个网址返回的网页源代码。但在之前需要首先:

from django.test import Client

Django的test类提供了很多内置的条件判断,我们只需要调用这些方法就可以断言输出是否是我们所期望的。比较常用的判断有:

assertEquals(a,b):判断a,b是否相等
self.assertRaises(a):通过访问能引发错误的代码,期待函数抛出a错误

post和get命令传递参数的方式是不一样的。
用post命令传递参数的时候,要用字典的形式来传参;
用get命令传参的时候,可以用?后跟参数的形式。
还有其他的传参形式,但普遍使用的是这两种方式。
c.get('/api/a/activity/detail?id=1')
c.post('/api/a/login', {"username": "1", "password": "11111"})

小贴士:
可以在测试中编写setUp()和tearDown()方法。这两个方法会分别在每一个测试方法的前后分别被执行。

setUp()和tearDown()方法有什么用呢?设想你的测试需要启动一个数据库,这时,就可以在setUp()方法中连接数据库,在tearDown()方法中关闭数据库,这样,不必在每个测试方法中重复相同的代码

测试中遇到的问题与思考

  1. 在项目的实现中,我们的编程与测试是两个人分开进行的,对于一些接口的输入输出格式,需要进行交流,否则会在测试代码中出现问题
  2. 要在测试中,充分考虑边界的情况,触发一些用户在使用中可能存在的误操作,测试程序的鲁棒性
  3. 测试过程中,涉及到连接远程的数据库,因此每一次测试的速度都比较慢,可以考虑在本地安装数据库提升速度。
  4. 测试的调试感觉还是花了很久的。因为要跟写代码的人对接,而且报错信息比较乱,前后折腾了好几天,算是增长经验吧

你可能感兴趣的:(测试)