单元测试负责对最小的软件设计单元(模块)进行验证,unittest是Python自带的单元测试框架。 单元测试与功能测试都是日常开发中必不可少的部分,本文演示了Python中unittest单元测试框架的基本使用。
来看一个简单的测试用例
定义一个类,简单的实现add、sub两个方法,并对其进行单元测试。
待测试的m1.py文件内容如下:
class MyClass(object): """just a test case""" def __init__(self, x, y): self.x = int(x) self.y = int(y) def add(self): return self.x + self.y def sub(self): return self.x - self.y |
在与m1.py同级的目录下创建test.py测试文件,使用unittest单元测试框架对A类的方法进行测试。代码内容如下:
import unittest from m1 import MyClass class MyClassTest(unittest.TestCase): def setUp(self): self.calc = MyClass(7, 5) def tearDown(self): pass def test_add(self): ret = self.calc.add() self.assertEqual(ret, 12) def test_sub(self): ret = self.calc.sub() self.assertEqual(ret, 2) if __name__ == '__main__': # 构造测试集 suite = unittest.TestSuite() suite.addTest(MyClassTest('test_add')) suite.addTest(MyClassTest('test_sub')) # 执行测试 runner = unittest.TextTestRunner() runner.run(suite) |
运行测试:
demo1 $ python3 test.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
到此一个简单的单元测试就完成了。
unittest框架知识点
unittest框架中4个重要的概念:
1.test fixture:是初始化和清理测试数据及环境,通过重写TestCase的setUp()和tearDown()方法来实现。
2.test case:是测试用例。
3.test suite:是测试用例的集合(俗称测试套件),通过addTest加载TestCase到TestSuite中,返回一个TestSuite实例。
4.test runner:的作用是运行测试用例并返回结果,通过TextTestRunner类提供的run()方法来执行test suite或test case。
Django中的单元测试
Django项目的app目录下都默认生成了一个tests.py文件,我们可以把我们的测试用例代码都写在这个文件中。
Model部分单元测试用例
假设项目中有一个Book的model:
class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalField(max_digits=10, decimal_places=2) |
测试用例代码:
# app01/tests.py from django.test import TestCase from app01.models import Book # Create your tests here. class BookModelTest(TestCase): def setUp(self): Book.objects.create(title='书名', price=11.11) def test_book_model(self): from decimal import Decimal result = Book.objects.get(title='书名') self.assertEqual(result.price, Decimal('11.11')) |
运行测试,在项目目录下运行:
$ python3 manage.py test
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.
----------------------------------------------------------------------
Ran 1 test in 0.003s
OK
Destroying test database for alias 'default'...
测试用例OK…
视图部分单元测试用例
假设我们有个index视图,代码如下:
def index(request): return render(request, 'index.html') 在app01/tests.py文件中添加测试用例代码: # app01/tests.py class IndexPageTest(TestCase): """测试index页面""" def test_index_page_renders_index_template(self): """测试index视图""" response = self.client.get('/index/') self.assertEqual(response.status_code, 200) # 判断状态码 self.assertTemplateUsed(response, 'index.html') # 判断渲染的模板是否正确 |
在项目根目录运行python manage.py test命令:
$ python3 manage.py test
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
..
----------------------------------------------------------------------
Ran 2 tests in 0.027s
OK
Destroying test database for alias 'default'...
python manage.py test命令会查找当前项目中的tests.py文件,并运行测试用例。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理