Django如何获得live_server_url?

时间:2017-12-31 10:50:34

标签: python django port netstat

我从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!

4 个答案:

答案 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()类似。