返回顶部
首页 > 资讯 > 后端开发 > Python >对Python的Django框架中的项目进行单元测试的方法
  • 748
分享到

对Python的Django框架中的项目进行单元测试的方法

框架单元测试方法 2022-06-04 19:06:48 748人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

Python中的单元测试 我们先来回顾一下python中的单元测试方法。 下面是一个 Python的单元测试简单的例子: 假如我们开发一个除法的功能,有的同学可能觉得很简单,代码是这样的: def d

Python中的单元测试

我们先来回顾一下python中的单元测试方法。
下面是一个 Python的单元测试简单的例子:

假如我们开发一个除法的功能,有的同学可能觉得很简单,代码是这样的:


def division_funtion(x, y):
  return x / y

但是这样写究竟对还是不对呢,有些同学可以在代码下面这样测试:


def division_funtion(x, y):
  return x / y
 
 
if __name__ == '__main__':
  print division_funtion(2, 1)
  print division_funtion(2, 4)
  print division_funtion(8, 3)

但是这样运行后得到的结果,自己每次都得算一下去核对一遍,很不方便,Python中有 unittest 模块,可以很方便地进行测试,详情可以文章最后的链接,看官网文档的详细介绍。

下面是一个简单的示例:


import unittest
 
 
def division_funtion(x, y):
  return x / y
 
 
class TestDivision(unittest.TestCase):
  def test_int(self):
    self.assertEqual(division_funtion(9, 3), 3)
 
  def test_int2(self):
    self.assertEqual(division_funtion(9, 4), 2.25)
 
  def test_float(self):
    self.assertEqual(division_funtion(4.2, 3), 1.4)
 
 
if __name__ == '__main__':
  unittest.main()


我简单地写了三个测试示例(不一定全面,只是示范,比如没有考虑除数是0的情况),运行后发现:


F.F
======================================================================
FAIL: test_float (__main__.TestDivision)
----------------------------------------------------------------------
Traceback (most recent call last):
 File "/Users/tu/YunPan/mydivision.py", line 16, in test_float
  self.assertEqual(division_funtion(4.2, 3), 1.4)
AssertionError: 1.4000000000000001 != 1.4
 
======================================================================
FAIL: test_int2 (__main__.TestDivision)
----------------------------------------------------------------------
Traceback (most recent call last):
 File "/Users/tu/YunPan/1.py", line 13, in test_int2
  self.assertEqual(division_funtion(9, 4), 2.25)
AssertionError: 2 != 2.25
 
----------------------------------------------------------------------
Ran 3 tests in 0.001s
 
FAILED (failures=2)

汗!发现了没,竟然两个都失败了,测试发现:

4.2除以3 等于 1.4000000000000001 不等于期望值 1.4

9除以4等于2,不等于期望的 2.25

下面我们就是要修复这些问题,再次运行测试,直到运行不报错为止。

譬如根据实际情况,假设我们只需要保留到小数点后6位,可以这样改:


def division_funtion(x, y):
  return round(float(x) / y, 6)

再次运行就不报错了:


...
----------------------------------------------------------------------
Ran 3 tests in 0.000s


OK

Django中的单元测试

尽早进行单元测试(UnitTest)是比较好的做法,极端的情况甚至强调“测试先行”。现在我们已经有了第一个model类和FORM类,是时候开始写测试代码了。

Django支持python的单元测试(unit test)和文本测试(doc test),我们这里主要讨论单元测试的方式。这里不对单元测试的理论做过多的阐述,假设你已经熟悉了下列概念:test suite, test case, test/test action, test data, assert等等。

在单元测试方面,DjanGo继承python的unittest.TestCase实现了自己的django.test.TestCase,编写测试用 例通常从这里开始。测试代码通常位于app的tests.py文件中(也可以在models.py中编写,但是我不建议这样做)。在Django生成的 depotapp中,已经包含了这个文件,并且其中包含了一个测试用例的样例:

depot/depotapp/tests.py


from django.test import TestCase
class SimpleTest(TestCase):
def test_basic_addition(self):
"""
Tests that 1 + 1 always equals 2.
"""
self.assertEqual(1 + 1, 2)

你可以有几种方式运行单元测试:

python manage.py test:执行所有的测试用例 python manage.py test app_name, 执行该app的所有测试用例 python manage.py test app_name.case_name: 执行指定的测试用例

用第三种方式执行上面提供的样例,结果如下:


$ python manage.py test depotapp.SimpleTest

Creating test database for alias 'default'...
.
----------------------------------------------------------------------
Ran 1 test in 0.012s

OK
Destroying test database for alias 'default'...

你可能会主要到,输出信息中包括了创建和删除数据库的操作。为了避免测试数据造成的影响,测试过程会使用一个单独的数据库,关于如何指定测试数据库 的细节,请查阅Django文档。在我们的例子中,由于使用sqlite数据库,Django将默认采用内存数据库来进行测试。

下面就让我们来编写测试用例。在《Agile WEB Development with Rails 4th》中,7.2节,最终实现的ProductTest代码如下:


class ProductTest < ActiveSupport::TestCase
test "product attributes must not be empty"do
product = Product.new
assert product.invalid?
assert product.errors[:title].any?
assert product.errors[:description].any?
assert product.errors[:price].any?
assert product.errors[:image_url].any?
end
test "product price must be positive"do
product = Product.new(:title => "My Book Title",
:description => "yyy",
:image_url => "zzz.jpg")
product.price = -1
assert product.invalid?
assert_equal "must be greater than or equal to 0.01",
product.errors[:price].join('; ')
product.price = 0
assert product.invalid?
assert_equal "must be greater than or equal to 0.01",
product.errors[:price].join('; ')
product.price = 1
assert product.valid?
end
def new_product(image_url)
Product.new(:title => "My Book Title",
:description => "yyy",
:price => 1,
:image_url => image_url)
end
test "image url"do
ok = %w{ fred.gif fred.jpg fred.png FRED.JPG FRED.Jpg
/file/imgs/upload/202206/04/gq4dn33ohdm.gif }
bad = %w{ fred.doc fred.gif/more fred.gif.more }
ok.eachdo |name|
assert new_product(name).valid?, "#{name} shouldn't be invalid"
end
bad.eachdo |name|
assert new_product(name).invalid?, "#{name} shouldn't be valid"
end
end
test "product is not valid without a unique title"do
product = Product.new(:title => products(:ruby).title,
:description => "yyy",
:price => 1,
:image_url => "fred.gif")
assert !product.save
assert_equal "has already been taken", product.errors[:title].join('; ')
end
test "product is not valid without a unique title - i18n"do
product = Product.new(:title => products(:ruby).title,
:description => "yyy",
:price => 1,
:image_url => "fred.gif")
assert !product.save
assert_equal I18n.translate('activerecord.errors.messages.taken'),
product.errors[:title].join('; ')
end
end

对Product测试的内容包括:

1.title,description,price,image_url不能为空;

2. price必须大于零;

3. image_url必须以jpg,png,jpg结尾,并且对大小写不敏感;

4. titile必须唯一;

让我们在Django中进行这些测试。由于ProductForm包含了模型校验和表单校验规则,使用ProductForm可以很容易的实现上述测试:

depot/depotapp/tests.py


#/usr/bin/python
#coding: utf8
"""
This file demonstrates writing tests using the unittest module. These will pass
when you run "manage.py test".
Replace this with more appropriate tests for your application.
"""
from django.test import TestCase
from forms import ProductForm
class SimpleTest(TestCase):
def test_basic_addition(self):
"""
Tests that 1 + 1 always equals 2.
"""
self.assertEqual(1 + 1, 2)
class ProductTest(TestCase):
def setUp(self):
self.product = {
'title':'My Book Title',
'description':'yyy',
'image_url':'/file/imgs/upload/202206/04/jzj4f2uncsl.png',
'price':1
}
f = ProductForm(self.product)
f.save()
self.product['title'] = 'My Another Book Title'
#### title,description,price,image_url不能为空
def test_attrs_cannot_empty(self):
f = ProductForm({})
self.assertFalse(f.is_valid())
self.assertTrue(f['title'].errors)
self.assertTrue(f['description'].errors)
self.assertTrue(f['price'].errors)
self.assertTrue(f['image_url'].errors)
####  price必须大于零
def test_price_positive(self):
f = ProductForm(self.product)
self.assertTrue(f.is_valid())
self.product['price'] = 0
f = ProductForm(self.product)
self.assertFalse(f.is_valid())
self.product['price'] = -1
f = ProductForm(self.product)
self.assertFalse(f.is_valid())
self.product['price'] = 1
####  image_url必须以jpg,png,jpg结尾,并且对大小写不敏感;
def test_imgae_url_endwiths(self):
url_base = '/file/imgs/upload/202206/04/fukt13ztx55.gif', 'fred.jpg', 'fred.png', 'FRED.JPG', 'FRED.Jpg')
bads = ('fred.doc', 'fred.gif/more', 'fred.gif.more')
for endwith in oks:
self.product['image_url'] = url_base+endwith
f = ProductForm(self.product)
self.assertTrue(f.is_valid(),msg='error when image_url endwith '+endwith)
for endwith in bads:
self.product['image_url'] = url_base+endwith
f = ProductForm(self.product)
self.assertFalse(f.is_valid(),msg='error when image_url endwith '+endwith)
self.product['image_url'] = '/file/imgs/upload/202206/04/jzj4f2uncsl.png'
###  titile必须唯一
def test_title_unique(self):
self.product['title'] = 'My Book Title'
f = ProductForm(self.product)
self.assertFalse(f.is_valid())
self.product['title'] = 'My Another Book Title'

然后运行 python manage.py test depotapp.ProductTest。如同预想的那样,测试没有通过:


Creating test database for alias 'default'...
.F..
======================================================================
FAIL: test_imgae_url_endwiths (depot.depotapp.tests.ProductTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/holbrook/Documents/Dropbox/depot/../depot/depotapp/tests.py", line 65, in test_imgae_url_endwiths
self.assertTrue(f.is_valid(),msg='error when image_url endwith '+endwith)
AssertionError: False is not True : error when image_url endwith FRED.JPG

----------------------------------------------------------------------
Ran 4 tests in 0.055s

FAILED (failures=1)
Destroying test database for alias 'default'...

因为我们之前并没有考虑到image_url的图片扩展名可能会大写。修改ProductForm的相关部分如下:


def clean_image_url(self):
url = self.cleaned_data['image_url']
ifnot endsWith(url.lower(), '.jpg', '.png', '.gif'):
raise forms.ValidationError('图片格式必须为jpg、png或gif')
return url

然后再运行测试:


$ python manage.py test depotapp.ProductTest

Creating test database for alias 'default'...
....
----------------------------------------------------------------------
Ran 4 tests in 0.060s

OK
Destroying test database for alias 'default'...

测试通过,并且通过单元测试,我们发现并解决了一个bug。

--结束END--

本文标题: 对Python的Django框架中的项目进行单元测试的方法

本文链接: https://lsjlt.com/news/15128.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 对Python的Django框架中的项目进行单元测试的方法
    Python中的单元测试 我们先来回顾一下Python中的单元测试方法。 下面是一个 Python的单元测试简单的例子: 假如我们开发一个除法的功能,有的同学可能觉得很简单,代码是这样的: def d...
    99+
    2022-06-04
    框架 单元测试 方法
  • Python中单元测试框架 Nose的安
    1 安装setuptoolsdownload地址:http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz#md5=7df2a529a074f6...
    99+
    2023-01-31
    框架 单元测试 Python
  • PHP中的单元测试框架
    随着软件开发领域的迅速发展,软件测试的重要性也越来越被大家所重视。单元测试是软件测试中的一个重要环节,它能够在程序开发的早期就发现潜在的问题,从而提高软件的质量和稳定性。而在PHP语言领域中,有许多非常优秀的单元测试框架,本文将介绍其中的一...
    99+
    2023-05-23
    框架 PHP 单元测试
  • 如何使用单元测试框架对 Golang 函数进行测试?
    go 中使用单元测试框架进行单元测试:导入 testing 包。编写以 test 为前缀的单元测试函数。使用断言函数(如 assertequal())验证测试结果。运行单元测试(go t...
    99+
    2024-04-16
    golang 单元测试 标准库
  • django写单元测试的方法
       从网上找了很多django单元测试的案例,感觉不是很好用,于是自己写了一套测试方法,在测试环境我们只需要传uri 、请求方式、参数即可一键对所有接口进行...
    99+
    2024-04-02
  • 对ASP.Net的WebAPI项目进行测试
    如果项目采取前后端分离的模式进行开发,那么我们的WebAPI最终是需要提供给前端页面来进行调用的。 那么在进行对接之前必须要保证我们的WebAPI没有Bug,在这种情况下作为开发者对...
    99+
    2024-04-02
  • 如何使用Spring-Test对Spring框架进行单元测试
    目录Spring-Test对Spring框架进行单元测试加载依赖编写SpringTestBase基础类,加载所需xml文件编写单元测试类 示例Spring-Test测试数据1、新建一...
    99+
    2024-04-02
  • C#中如何使用单元测试框架进行自动化测试
    C#中如何使用单元测试框架进行自动化测试引言:在软件开发过程中,自动化测试是一个非常重要的环节。通过编写和运行测试代码,可以帮助我们验证和确保代码的正确性和稳定性。在C#开发中,我们可以使用单元测试框架来实现自动化测试。本文将介绍C#中常用...
    99+
    2023-10-22
    自动化测试 C# 单元测试
  • python的Django框架创建项目的方法是什么
    这篇文章主要讲解了“python的Django框架创建项目的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python的Django框架创建项目的方法是什么”吧!具体如下:  Dj...
    99+
    2023-06-02
  • C#中常见的测试框架和单元测试问题
    C#中常见的测试框架和单元测试问题,需要具体代码示例引言:在软件开发过程中,测试是一个至关重要的环节。通过测试,我们可以确保代码的质量和稳定性,提高应用程序的可靠性和可维护性。C#是一种广泛应用于软件开发的编程语言,因此需要了解C#中常见的...
    99+
    2023-10-22
    测试框架: NUnit 测试框架: MSTest 单元测试问题:断言错误
  • Java使用Junit4.jar进行单元测试的方法
    目录一、下载依赖包二、添加到依赖三、设置 test 目录四、创建测试类五、开始测试一、下载依赖包 分别下载 junit.jar 以及 hamcrest-core.jar 二、添加到依...
    99+
    2024-04-02
  • php的单元测试框架有哪些
    php中常见的单元测试框架有PHPUnit、SimpleTest、Peridot PHPUnit PHPUnit是一款使用php开发的单元测试框架,由Sebastian Bergmann创建,PHPUnit提供了一系列共同、有用的功能来实现...
    99+
    2024-04-02
  • 如何进行PHP的单元测试?
    随着软件开发的不断发展,测试已经成为开发过程中不可或缺的一部分。在进行测试时,单元测试是非常重要的一种测试方式。在 PHP 中,使用单元测试可以有效地减少代码中存在的错误,提高代码质量。本文将向你介绍如何进行 PHP 的单元测试。一、什么是...
    99+
    2023-05-14
    PHP 单元测试 测试覆盖率
  • Spring MVC中的Controller进行单元测试的实现
    目录导入静态工具方法初始化MockMvc执行测试测试GET接口测试POST接口测试文件上传定义预期结果写在最后对Controller进行单元测试是Spring框架原生就支持的能力,它...
    99+
    2024-04-02
  • golang 对私有函数进行单元测试的实例
    在待测试的私有函数所在的包内,新建一个xx_test.go文件 书写方式如下: import ( "github.com/stretchr/testify/assert" "...
    99+
    2024-04-02
  • Python Unittest如何进行自动化的单元测试
    这篇文章将为大家详细讲解有关Python Unittest如何进行自动化的单元测试,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、python 测试框架(本文只涉及 P...
    99+
    2024-04-02
  • 自动化测试Pytest单元测试框架的基本介绍
    目录一、Pytest概念二、Pytest特点三、Pytest安装安装pytest命令:查看pytest版本:安装生成测试结果的HTML报告pytest-html四、Pycharm配置...
    99+
    2024-04-02
  • Yii框架的测试武器库:单元测试、功能测试和集成测试
    范围:单元测试关注代码的特定部分,而不考虑外部依赖关系。它们验证代码的行为是否符合预期,并覆盖所有代码路径。 优点: 快速执行 容易维护 可以自动化并集成到持续集成管道中 缺点: 无法测试代码的依赖关系集成 覆盖面可能不全面,可能遗...
    99+
    2024-04-02
  • 常用的c++单元测试框架有哪些
    常用的C++单元测试框架有以下几个:1. Google Test:由Google开发的C++单元测试框架,功能强大且易于使用,支持参...
    99+
    2023-10-27
    c++
  • PHP 单元测试框架的扩展与定制
    通过扩展和定制 phpunit 框架,可解决原有框架无法满足需求的问题。扩展方面,包括自定义断言、matcher 和 dataprovider;定制方面,涉及创建自定义运行器、覆盖 bo...
    99+
    2024-05-06
    php 单元测试 bootstrap
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作