Python单元测试简介及Django中的单元测试

发表于:2021-2-22 09:37

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:小学弟-    来源:博客园

  单元测试负责对最小的软件设计单元(模块)进行验证,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),我们将立即处理
精选软件测试好文,快来阅读吧~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号