使用硒的 Django 测试未加载固定装置
Django tests with selenium not loading fixtures
我正在使用 Selenium 为 Django 网站设置功能测试。我有一个夹具文件 (users/fixtures/users.json
) 并在另一个应用程序 (accounts
) 的功能测试中使用它。当 运行 进行测试时,我还 运行 我的开发服务器接受来自 Selenium 浏览器自动化的请求;我 运行 ./manage.py test
和 ./manage.py runserver
在同一个设置模块上,这样两者都具有同一个数据库的凭据。
我的 accounts
测试无法加载 users
夹具:
from django.test import TestCase
class AccountCreationTestCase(TestCase):
fixtures = ['users']
# Tests depending on user login follow.
# These tests are run via Selenium for browser automation.
当我通过命令行手动将夹具加载到测试数据库中时,这些测试会成功,否则它们会失败,所以我知道它们正在使用数据库中存在的夹具数据,而且我也知道他们无法加载测试装置。
回顾一下:我正在 运行宁 ./manage.py test
和 ./manage.py runserver
在定义测试数据库访问凭据的同一设置模块上。如果 fixtures 被加载到测试数据库中,那么当它们 运行 通过 Selenium 时,该数据应该可供测试使用。
我错过了什么?
编辑 1:对于上下文,我使用的是 Django 1.8。此外,我正在使用 Selenium 来自动化 PhantomJS,以便测试可以 运行 更快。
编辑 2:我刚刚更深入地阅读了 Django 文档,发现了两个我正在 运行 关注的问题。
第一个问题:Django 测试 automatically prefix 数据库名称为 test_
,因此您必须确保您的测试服务器和 Django 测试按名称使用相同的数据库,如下所示:
DATABASES = {
'NAME': "test_db_name",
'TEST': {
'NAME': "test_db_name"
}
}
第二期:Django docs 解释 Django 在测试 运行 之间破坏测试数据库。这将导致开发服务器失败,因为它需要存在数据库。 Django 1.8 为测试 运行ner 引入了 --keepdb
选项,它将在测试之间保持数据库实例。虽然此标志确实允许服务器在测试数据库上 运行,但我似乎仍然无法将装置加载到该数据库中。这可能是由于使用了新标志造成的,它确实显着修改了测试加载测试数据库的行为。
有一次我遇到了同样的问题,我注意到不知何故,Django 测试用例和 Selenium 不使用相同的数据库。为什么?我不知道!
我认为是关于拆卸和设置的问题...无论如何,我认为您可以在这里解决您的问题 -> How to have Django test case and Selenium server use same database?
使用 Selenium 进行 Django 测试可能很棘手。回顾一下,要使这样的测试正常工作,您必须处理三个主要问题:
1) Selenium 需要一个 运行ning Django 服务器来反弹请求。
2) 你的 运行ning Django 服务器应该连接到测试数据库。
3) TestCase 在事务中测试 运行。由于 运行ning Django 服务器无法查看测试用例的事务,因此您加载的任何固定装置都将完全 invisible/inaccessible 到 Selenium(来源:Lara's link, qris's answer)。
解决方法:
要解决前两个问题,您需要一个 testing-specific 设置文件。在其中,您需要定义一个指向您的测试数据库的默认数据库,并且您需要提供测试数据库的设置以便名称匹配(参见我的问题中的示例)。当您计划 运行 您的测试时,您需要 运行 Django 开发服务器和使用测试设置文件的测试。
要解决第三个问题,请使用TransactionTestCase
而不是TestCase
。 TransactionTestCase
旨在让开发人员在测试期间更好地控制事务行为,因此它不会自动 运行 事务内的所有内容(反过来,给 运行ning 服务器实例访问固定装置)。尽管这并不是我们在这种情况下想要做的,但结果是测试会自动运行并自动清理。
注意:您可能应该考虑将 black-box 和 white-box 测试分开。这使您的 Django 测试保持 "vanilla",因此未来的开发人员不必浪费太多时间来弄清楚为什么 Django 文档似乎并不适用于所有情况。它还将功能测试与单元测试分离,这在您团队中的开发人员无法在他们的机器上访问 Selenium(或 Selenium 的兼容版本)或者您想要 运行 的情况下非常有用仅单元测试或功能测试,但不能同时进行。您需要手动设置测试环境以满足您的需求,但我相信这将使测试代码在长期 运行.
中保持清洁。
感谢 Lara 为我指明了正确的方向。
我正在使用 Selenium 为 Django 网站设置功能测试。我有一个夹具文件 (users/fixtures/users.json
) 并在另一个应用程序 (accounts
) 的功能测试中使用它。当 运行 进行测试时,我还 运行 我的开发服务器接受来自 Selenium 浏览器自动化的请求;我 运行 ./manage.py test
和 ./manage.py runserver
在同一个设置模块上,这样两者都具有同一个数据库的凭据。
我的 accounts
测试无法加载 users
夹具:
from django.test import TestCase
class AccountCreationTestCase(TestCase):
fixtures = ['users']
# Tests depending on user login follow.
# These tests are run via Selenium for browser automation.
当我通过命令行手动将夹具加载到测试数据库中时,这些测试会成功,否则它们会失败,所以我知道它们正在使用数据库中存在的夹具数据,而且我也知道他们无法加载测试装置。
回顾一下:我正在 运行宁 ./manage.py test
和 ./manage.py runserver
在定义测试数据库访问凭据的同一设置模块上。如果 fixtures 被加载到测试数据库中,那么当它们 运行 通过 Selenium 时,该数据应该可供测试使用。
我错过了什么?
编辑 1:对于上下文,我使用的是 Django 1.8。此外,我正在使用 Selenium 来自动化 PhantomJS,以便测试可以 运行 更快。
编辑 2:我刚刚更深入地阅读了 Django 文档,发现了两个我正在 运行 关注的问题。
第一个问题:Django 测试 automatically prefix 数据库名称为 test_
,因此您必须确保您的测试服务器和 Django 测试按名称使用相同的数据库,如下所示:
DATABASES = {
'NAME': "test_db_name",
'TEST': {
'NAME': "test_db_name"
}
}
第二期:Django docs 解释 Django 在测试 运行 之间破坏测试数据库。这将导致开发服务器失败,因为它需要存在数据库。 Django 1.8 为测试 运行ner 引入了 --keepdb
选项,它将在测试之间保持数据库实例。虽然此标志确实允许服务器在测试数据库上 运行,但我似乎仍然无法将装置加载到该数据库中。这可能是由于使用了新标志造成的,它确实显着修改了测试加载测试数据库的行为。
有一次我遇到了同样的问题,我注意到不知何故,Django 测试用例和 Selenium 不使用相同的数据库。为什么?我不知道!
我认为是关于拆卸和设置的问题...无论如何,我认为您可以在这里解决您的问题 -> How to have Django test case and Selenium server use same database?
使用 Selenium 进行 Django 测试可能很棘手。回顾一下,要使这样的测试正常工作,您必须处理三个主要问题:
1) Selenium 需要一个 运行ning Django 服务器来反弹请求。
2) 你的 运行ning Django 服务器应该连接到测试数据库。
3) TestCase 在事务中测试 运行。由于 运行ning Django 服务器无法查看测试用例的事务,因此您加载的任何固定装置都将完全 invisible/inaccessible 到 Selenium(来源:Lara's link, qris's answer)。
解决方法: 要解决前两个问题,您需要一个 testing-specific 设置文件。在其中,您需要定义一个指向您的测试数据库的默认数据库,并且您需要提供测试数据库的设置以便名称匹配(参见我的问题中的示例)。当您计划 运行 您的测试时,您需要 运行 Django 开发服务器和使用测试设置文件的测试。
要解决第三个问题,请使用TransactionTestCase
而不是TestCase
。 TransactionTestCase
旨在让开发人员在测试期间更好地控制事务行为,因此它不会自动 运行 事务内的所有内容(反过来,给 运行ning 服务器实例访问固定装置)。尽管这并不是我们在这种情况下想要做的,但结果是测试会自动运行并自动清理。
注意:您可能应该考虑将 black-box 和 white-box 测试分开。这使您的 Django 测试保持 "vanilla",因此未来的开发人员不必浪费太多时间来弄清楚为什么 Django 文档似乎并不适用于所有情况。它还将功能测试与单元测试分离,这在您团队中的开发人员无法在他们的机器上访问 Selenium(或 Selenium 的兼容版本)或者您想要 运行 的情况下非常有用仅单元测试或功能测试,但不能同时进行。您需要手动设置测试环境以满足您的需求,但我相信这将使测试代码在长期 运行.
中保持清洁。感谢 Lara 为我指明了正确的方向。