Python 两个测试单独工作,但不能同时工作
我在不同的类中有两个测试,测试相似的行为:Python 两个测试单独工作,但不能同时工作,python,django,django-tests,Python,Django,Django Tests,我在不同的类中有两个测试,测试相似的行为: 使用Client()在书签中添加产品 使用ORM在书签中添加产品 就个人而言,它正在发挥作用: ./manage.py test compare.test.CompareBookmarkTests 或 它们在一起发射时失败: ./manage.py test 我试图: 使用setUp和tearDown方法 类和方法的变更顺序 在我尝试诊断问题时使用--reverse 使用测试数据库在交互式django shell中启动代码行(它正在工作) 进行一
Client()
在书签中添加产品./manage.py test compare.test.CompareBookmarkTests
或
它们在一起发射时失败:
./manage.py test
我试图:
- 使用
和setUp
方法tearDown
- 类和方法的变更顺序
- 在我尝试诊断问题时使用--reverse
- 使用测试数据库在交互式django shell中启动代码行(它正在工作)
- 进行一些打印调试,从测试数据库正确调用我的对象
- 将这两个类合并为一个类
从django.contrib.auth.models导入用户
从django.test导入TestCase
从。模型导入书签、分类、产品
类CompareBookmarkTests(TestCase):
def设置(自):
Categorie.objects.create(id\u Categorie='someid',name='somename')
p=Categorie.objects.get(pk='someid')
p、 产品集。创建(id\u product='1',product\u name='橙色',category='someid')
User.objects.create\u User('john@sign.in', 'john@sign.in","史密斯")
def拆卸(自):
User.objects.all().delete()
Categorie.objects.all().delete()
Bookmark.objects.all().delete()
def测试_重定向_记录(自):
self.client.login(用户名=)john@sign.in“,密码=”史密斯“)
#正在书签中添加id为1的产品
response=self.client.get(“/compare/1/bookmark/”)
#获取添加的产品表单书签
bookmark=bookmark.objects.get(pk=1)
self.assertEqual(str(bookmark),'bookmark对象(1)'
self.assertEqual(response.status_代码,302)
类CompareAccountTests(TestCase):
def设置/拆卸:[与上一类相同]
def测试获取产品(自我):
self.client.login(用户名=)john@sign.in“,密码=”史密斯“)
user=user.objects.get(pk=1)
product=product.objects.get(pk='1')
#正在书签中添加id为1的产品
add\u bookmark=bookmark.objects.create(id\u result=product,user=user)
bookmark=bookmark.objects.get(pk=1)
response=self.client.get(“/compare/account/”)
self.assertEqual(str(bookmark),'bookmark对象(1)'
self.assertEqual(response.status_代码,200)
我希望两个测试在一起启动时都能成功,但我得到:
compare.models.Bookmark.DoesNotExist:书签匹配查询不存在。
使用--reverse:
django.contrib.auth.models.User.DoesNotExist
这可能是初学者的错误,但我看不出来,谢谢你的帮助 我已经找到了可能导致问题的原因: 我使用了
psql
,找到了未删除的测试数据库:
test_myprojet_1
test_myprojet_2
test_myprojet_3
test_myprojet_4
...and so on...
除了一个非常奇怪的问题:
test_test_test_test_test_test_test_test_test_test_test_myprojec[truncated name]
我在psql
中使用了:
删除数据库[名称];
现在,我的测试按预期进行
多亏了,您的建议让我走上了正轨。我发现了可能导致问题的原因: 我使用了
psql
,找到了未删除的测试数据库:
test_myprojet_1
test_myprojet_2
test_myprojet_3
test_myprojet_4
...and so on...
除了一个非常奇怪的问题:
test_test_test_test_test_test_test_test_test_test_test_myprojec[truncated name]
我在psql
中使用了:
删除数据库[名称];
现在,我的测试按预期进行
多亏了,您的建议让我走上了正轨。在测试中依赖具体的ID不是一个好主意,因为测试后可能不会清除DB序列,您将创建一个具有
pk=2
的对象。尝试在不使用具体pk值的情况下重写测试。谢谢您的回答。我不确定是否完全理解您的建议:例如,我是否应该通过另一个字段而不是pk值获取对象?如果是这样的话,我尝试了它,但没有成功。在我的实验中,我还试图找到两次测试之间可能产生的任何重复。情况似乎并非如此。不,使用pk,但不要期望pk总是1
、2
或其他。如果您需要访问在设置
中创建的对象的pk,您可以将对象存储到self
中,然后在测试用例中使用它。在测试中依赖具体ID不是一个好主意,因为测试后可能不会清除DB序列,并且您将创建一个具有pk=2
的对象对象。尝试在不使用具体pk值的情况下重写测试。谢谢您的回答。我不确定是否完全理解您的建议:例如,我是否应该通过另一个字段而不是pk值获取对象?如果是这样的话,我尝试了它,但没有成功。在我的实验中,我还试图找到两次测试之间可能产生的任何重复。情况似乎并非如此。不,使用pk,但不要期望pk总是1
、2
或其他。如果您需要访问在setUp
中创建的对象的pk,您可以将对象存储到self
中,然后在测试用例中使用它。