这里我用的是使用selenium进行端到端测试的片段(我在selenium django测试中是全新的);
from django.contrib.auth.models import User
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from selenium.webdriver.chrome.webdriver import WebDriver
class MyTest(StaticLiveServerTestCase):
@classmethod
def setUpClass(cls):
super(DashboardTest, cls).setUpClass()
cls.selenium = WebDriver()
cls.user = User.objects.create_superuser(username=...,
password=...,
email=...)
time.sleep(1)
cls._login()
@classmethod
def _login(cls):
cls.selenium.get(
'%s%s' % (cls.live_server_url, '/admin/login/?next=/'))
...
def test_login(self):
self.selenium.implicitly_wait(10)
self.assertIn(self.username,
self.selenium.find_element_by_class_name("fixtop").text)
def test_go_to_dashboard(self):
query_json, saved_entry = self._create_entry()
self.selenium.get(
'%s%s' % (
self.live_server_url, '/dashboard/%d/' % saved_entry.id))
# assert on displayed values
def self._create_entry():
# create an entry using form and returns it
def test_create(self):
self.maxDiff = None
query_json, saved_entry = self._create_entry()
... assert on displayed values
我注意到在每次测试之间登录都不是持久的。所以我可以在_login
中使用setUp
,但要让我的测试更慢。
那么如何在测试之间保持持久登录?测试这些测试的最佳实践是什么(djnago selenium测试)?
答案 0 :(得分:1)
Selenium的浏览器测试速度很慢。然而,它们非常有价值,因为它们是您实现真正用户体验自动化的最佳镜头。
你不应该尝试用Selenium编写真正的单元测试。相反,使用它来编写一个或两个大型功能测试。尝试从头到尾捕获整个用户交互。然后构建您的测试套件,以便您可以单独运行快速,非Selenium单元测试,并且只需要偶尔运行慢速功能测试。
您的代码看起来不错,但在这种情况下,您可以将test_go_to_dashboard
和test_create
合并为一种方法。
答案 1 :(得分:0)
kevinharvey向我指出了解决方案!最后找到了一种减少测试时间和跟踪所有测试的方法:
我已将所有以test..
开头的方法重命名为_test_..
,并添加了一个调用每个_test_
方法的主方法:
def test_main(self):
for attr in dir(self):
# call each test and avoid recursive call
if attr.startswith('_test_') and attr != self.test_main.__name__:
with self.subTest("subtest %s " % attr):
self.selenium.get(self.live_server_url)
getattr(self, attr)()
这样,我可以单独测试(调试)每个方法:)