在接触开源社区Github之后,发现特别多的开源项目都会有单元测试TestCase。但是在步入工作后,从业了两个创业公司,发现大多数程序员都没有养成写单元测试的习惯。
在目前的公司面试了一些程序员,他们的工作经验平均都有三年以上,但是都没有编写单元测试的习惯。 问到"为什么不去编写单元测试呢?",无非就是回答"没有时间"、"写的都是接口,直接用客户端工具测试一下就可以了"。
在笔者使用了Django框架自带的TestCase之后,发现用TestCase测试接口不仅比一些客户端工具方便,而且还能降低在对代码进行修改之后出现BUG的几率, 特别是一些对代码有严重的洁癖喜欢优化代码的程序员来说真的非常有用。
而且运用框架的TestCase编写单元测试,还能结合一些CI工具来实现自动化测试,这个我也会专门写一篇文章来介绍我利用Gitlab CI结合Django的TestCase实现自动化测试的一些心得。
TestCase 类的结构
为了方便没用用过TestCase的读者,先简单介绍一下TestCase的类结构。
常见的TestCase由setUp函数、tearDown函数和test_func组成。
这里test_func是指你编写了测试逻辑的函数,而setUp函数则是在test_func函数之前执行的函数,tearDown函数则是在test_func执行之后执行的函数。
- from django.test import TestCase
-
-
- class Demo(TestCase):
- def setUp(self):
- print('setUp')
-
- def tearDown(self):
- print('tearDown')
-
- def test_demo(self):
- print('test_demo')
-
- def test_demo_2(self):
- print('test_demo2')复制代码
我们可以通过在Django项目的根目录运行以下命令来运行这个单元测试
- python manage.py test development_of_test_habits.tests.test_demo.Demo
- 复制代码
如果使用Pycharm来运行的话可以直接点击类左侧的运行箭头,更加方便地运行或者Debug这个单元测试。
可以从运行后的结果清晰的看到这个单元测试的执行顺序。
- Creating test database for alias 'default'...
- System check identified no issues (0 silenced).
- setUp
- test_demo
- tearDown
- .setUp
- test_demo2
- tearDown
- .
- ----------------------------------------------------------------------
- Ran 2 tests in 0.001s
-
- OK
- Destroying test database for alias 'default'...
- 复制代码
此外还可以从运行结果看到,在测试之前单元测试创建了一个测试数据库。
Creating test database for alias ‘default’…
然后在测试结束将数据库摧毁。
Destroying test database for alias ‘default’…
这个也就是在继承了Django框架中的TestCase,它已经帮你实现的一些逻辑方便用于测试,所以我们不需要在setUp和tearDown函数中实现这些逻辑。
利用TestCase测试接口
接下来讲一下我们如何使用TestCase来测试接口的,首先我们编写一个简单的接口,这里笔者是用Django Rest Framework的APIView来编写的,读者也可以使用自己管用的方法来编写。
- from rest_framework.views import APIView
- from rest_framework.response import Response
-
-
- class HelloTestCase(APIView):
- def get(self, request, *args, **kwargs):
- return Response({
- 'msg': 'Hello %s I am a test Case' % request.query_params.get('name', ',')
- })复制代码
然后这个接口类加到我们的路由中。

