如何编写意味着失败的 django 测试?

我有一个名为 Thing的模型,它有一个名为 name的属性,我希望 name 是一个字符字段,长度为 只有3个字符。

我该如何为此编写一个测试?

class TestCase1(TestCase):
def test1(self):
thing = Thing(name='1234')

如何正确地编写测试,以便在该对象失败时测试 通行证

48297 次浏览

这种方法应该可行:

thing = Thing.objects.create(name='1234')
# not sure if you need here .get() or if. create() truncates the field on its own
self.assertEqual(thing.name, '123') # or: self.assertEqual(len(thing.name), 3)

——但是这样的测试看起来很奇怪: -)

另外,请注意,MySQLdb 后端将引发警告异常,通知您截断字符串,因此您可能需要使用 assertRaises检查它。

如果希望 Thing (name =’1234’)引发异常,有两种方法可以处理这个问题。

一种是使用 Django 的 assertRaises (实际上来自 unittest/unittest2) :

def mytest(self):
self.assertRaises(FooException, Thing, name='1234')

除非 Thing (name =’1234’)引发 FooException 错误,否则这将失败。另一种方法是捕获预期的异常,如果没有发生,则引发一个异常,如下所示:

def mytest(self):
try:
thing = Thing(name='1234')
self.fail("your message here")
except FooException:
pass

显然,将 FooException 替换为您希望通过创建字符串太长的对象获得的对象。验证错误? ?

第三种选择(从 Python 2.7开始)是使用 assertRaises 作为上下文管理器,这使得代码更清晰、更易读:

def mytest(self):
with self.assertRaises(FooException):
thing = Thing(name='1234')

遗憾的是,这不允许自定义测试失败消息,所以要很好地记录测试。

我目前正在使用来自 团结一致expectedFailure装饰器。它的工作原理和广告中说的一样: 没有错误时失败,出现错误时通过。

我使用 expectedFailure来验证我的自定义断言例程是否能够正常工作,而不仅仅是对所有事情进行橡皮图章。

import unittest
from django.test import TestCase


class EmojiTestCase(TestCase):


@unittest.expectedFailure
def testCustomAssert(self):
self.assertHappyFace(':(') # must fail.

但是在测试过程中会打印一个警告消息。我和 Django 和 Nose 一起使用它。 其他人也看到了。

/usr/lib64/python3.4/unittest/case.py: 525: RuntimePolice: TestResult 没有 addExpectedFalse 方法,只是传递报告 运行时警告)

我来这里是想找到更好的解决办法,但一无所获。所以我至少想告诉其他人我的工作经历。

在我以前的项目中,我必须做一些像测试驱动开发,所以我写了一些测试用例,必须捕捉某些类型的错误。如果它没有得到错误,那么我已经搞砸了一些事情。在这里我分享我的代码。

from django.test import TestCase
from django.contrib.auth.models import User


class ModelTest(TestCase):


def test_create_user_with_email(self):


with self.assertRaises(TypeError):
email = "ah@gmail.com"
password = 'testpass1'


user = User.objects.create_user(
email = email,
password = password,)


self.assertEqual(user.email, email)
self.assertTrue(user.check_password(password))

你可以看到我已经尝试用电子邮件和密码创建一个用户,但默认的 Django 用户模型需要“用户名”和“密码”参数来创建用户。因此这里我的测试案例必须引发“ TypeError”。我在这里所做的。