Ale*_*ird 47 testing django tdd
我有一个名为Thingwith called 的模型name,我希望name为char字段,只有 3个字符长.
我该怎么写测试?
class TestCase1(TestCase):
def test1(self):
thing = Thing(name='1234')
Run Code Online (Sandbox Code Playgroud)
那个测试应该失败.如何正确编写测试以便在该对象失败时测试通过?
GDo*_*orn 91
如果你期望Thing(name ='1234')引发异常,有两种方法可以解决这个问题.
一种是使用Django的assertRaises(实际上来自unittest/unittest2):
def mytest(self):
self.assertRaises(FooException, Thing, name='1234')
Run Code Online (Sandbox Code Playgroud)
除非Thing(name ='1234')引发FooException错误,否则会失败.另一种方法是捕获预期的异常并在没有发生的情况下引发异常,如下所示:
def mytest(self):
try:
thing = Thing(name='1234')
self.fail("your message here")
except FooException:
pass
Run Code Online (Sandbox Code Playgroud)
显然,将FooException替换为您希望通过太长的字符串创建对象所获得的FooException.ValidationError?
第三个选项(从Python 2.7开始)是使用assertRaises作为上下文管理器,这使得代码更清晰,更易读:
def mytest(self):
with self.assertRaises(FooException):
thing = Thing(name='1234')
Run Code Online (Sandbox Code Playgroud)
遗憾的是,这不允许自定义测试失败消息,因此请妥善记录您的测试.有关更多详细信息,请参阅https://hg.python.org/cpython/file/2.7/Lib/unittest/case.py#l97.
在我之前的项目中,我必须做一些类似测试驱动开发的事情,所以我编写了一些测试用例,它必须捕获某些类型的错误。如果没有出现错误,那么我搞砸了一些东西。在这里我分享我的代码。
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))
Run Code Online (Sandbox Code Playgroud)
您可以看到我尝试使用电子邮件和密码创建用户,但默认 Django 用户模型需要“用户名”和“密码”参数来创建用户。所以在这里我的测试用例必须引发“TypeError”。这就是我在这里尝试做的。
我目前正在使用unittest的expectedFailure装饰器。这就像宣传的那样:没有错误时失败,失败时通过。
我expectedFailure用来验证我的自定义断言例程确实有效,而不仅仅是橡皮图章一切正常。
import unittest
from django.test import TestCase
class EmojiTestCase(TestCase):
@unittest.expectedFailure
def testCustomAssert(self):
self.assertHappyFace(':(') # must fail.
Run Code Online (Sandbox Code Playgroud)
但在测试期间打印警告消息。我将它与 Django 和 Nose 一起使用。这人已经看到了。
/usr/lib64/python3.4/unittest/case.py:525: RuntimeWarning: TestResult 没有 addExpectedFailure 方法,报告为通过 RuntimeWarning)
我来这里是为了寻找更好的解决方案,但没有找到。所以我至少想告诉其他人,我一直在与之合作。
| 归档时间: |
|
| 查看次数: |
25596 次 |
| 最近记录: |