我从TDD with Python学习了Django功能测试并调整到我的项目。
我的FT非常简单,请查看网址标题。
我使用live_server_url
来测试硒。
但它转到另一个端口号(56458),而不是8000。
(当我按照这本书时,它不是
$ python manage.py runserver &
...
Starting development server at http://127.0.0.1:8000/
...
$ python manage.py test functional_test
...
http://localhost:56458
E
======================================================================
...
我的functional_tests/tests.py
是:
from django.test import LiveServerTestCase
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import WebDriverException
from time import time, sleep
class NewVistorTest(LiveServerTestCase):
def setUp(self):
self.browser = webdriver.Firefox()
self.browser.implicitly_wait(3)
def tearDown(self):
self.browser.quit()
def test_render_a_list_of_candiates_in_home(self):
self.browser.get(self.live_server_url)
h1_text = self.browser.find_element_by_tag_name('h1').text
self.assertEqual(self.browser.title, 'Voting Dapp')
self.assertEqual(h1_text, 'A Simple Voting Application')
Doc说:
实时服务器侦听localhost并绑定到端口0,端口0使用操作系统分配的空闲端口。在测试期间,可以使用self.live_server_url访问服务器的URL。
所以我试着看一下监听端口(我觉得我这部分不成熟):
$ netstat | grep LISTEN
$ # nothing printed!
答案 0 :(得分:2)
您使用LiveServerTestCase。它为您启动Django服务器。无需像上一章那样启动服务器。
LiveServerTestCase与TransactionTestCase基本相同,只有一个额外的功能:它在安装时在后台启动一个实时Django服务器,并在拆除时将其关闭。这允许使用除Django虚拟客户端之外的自动测试客户端(例如Selenium客户端)在浏览器内执行一系列功能测试并模拟真实用户的操作。
https://docs.djangoproject.com/en/2.0/topics/testing/tools/#django.test.LiveServerTestCase
因此,您的测试服务器应该具有除开发服务器之外的其他端口。测试服务器也是一个空数据库的空项目。因此,在执行实际测试用例之前,您的测试需要创建所需的内容。
或者,您可以使用--liveserver LIVESERVER
指向其他环境的测试。请参阅python manage.py test -h
。
我认为测试开发服务器是错误的,因为这些数据可以更改(手动和之前的测试),因此不可重现。我认为测试应该是完全自包含的,这样它既可以单独运行,也可以与任意数量的其他测试用例任意组合运行。
答案 1 :(得分:2)
from selenium import webdriver
from django.urls import reverse
import time
class TestApiPages(StaticLiveServerTestCase):
def setUp(self):
self.browser = webdriver.Chrome('functional_test/chromedriver.exe')
def tearDown(self):
self.browser.close()
def test_api_list_displayed(self):
self.browser.get(('%s%s' % (self.live_server_url, '/admin/')))
答案 2 :(得分:1)
我遇到了和你一样的问题。同样的例外。
所以真正的问题是我的主页网址。我的主页网址类似于:http://127.0.0.1:8000/api/
,但服务器正在尝试使用 http://localhost:56458/
。
self.browser.get(('%s%s' % (self.live_server_url, '/api/')))
答案 3 :(得分:0)
我也在阅读TDD Python书。我使用的是Django 2.1,而不是Django 1.11。 我遇到了与您描述的相同的问题。我在setUpClass()中发现了,必须调用super()。setUpClass()。
@classmethod
def setUpClass(cls):
super().setUpClass()
与tearDownClass()类似。