Python 2.7 Python-执行测试时发生断言错误

Python 2.7 Python-执行测试时发生断言错误,python-2.7,web.py,Python 2.7,Web.py,我是web.py的新手。我遵循的是ex52 LPTHW,我必须对tests文件夹中的所有测试进行测试。但是由于断言错误,我得到了1个失败的测试。我试着阅读不同的断言错误以及它们发生的原因,但我无法理解这一点。我尝试扩展服务器可能显示的错误,比如500个内部错误,400个内部错误,但测试仍然失败。我创建了其他代码,就像书中提到的: 这是我的回溯: C:\lpthw\gothonweb>cd tests C:\lpthw\gothonweb\tests>nosetests Traceb

我是web.py的新手。我遵循的是ex52 LPTHW,我必须对tests文件夹中的所有测试进行测试。但是由于断言错误,我得到了1个失败的测试。我试着阅读不同的断言错误以及它们发生的原因,但我无法理解这一点。我尝试扩展服务器可能显示的错误,比如500个内部错误,400个内部错误,但测试仍然失败。我创建了其他代码,就像书中提到的:

这是我的回溯:

C:\lpthw\gothonweb>cd tests

C:\lpthw\gothonweb\tests>nosetests
Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\web\application.py", line 239, in process
    return self.handle()
  File "C:\Python27\lib\site-packages\web\application.py", line 230, in handle
    return self._delegate(fn, self.fvars, args)
  File "C:\Python27\lib\site-packages\web\application.py", line 420, in _delegate
    return handle_class(cls)
  File "C:\Python27\lib\site-packages\web\application.py", line 396, in handle_class
    return tocall(*args)
  File "C:\lpthw\gothonweb\bin\app.py", line 29, in GET
    return render.hello_form()
  File "C:\Python27\lib\site-packages\web\template.py", line 1017, in __getattr__
    t = self._template(name)
  File "C:\Python27\lib\site-packages\web\template.py", line 1014, in _template
    return self._load_template(name)
  File "C:\Python27\lib\site-packages\web\template.py", line 1001, in _load_template
    raise AttributeError, "No template named " + name
AttributeError: No template named hello_form

F...
======================================================================
FAIL: tests.app_tests.test_index
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\nose\case.py", line 197, in runTest
    self.test(*self.arg)
  File "C:\lpthw\gothonweb\tests\app_tests.py", line 12, in test_index
    assert_response(resp)
  File "C:\lpthw\gothonweb\tests\tools.py", line 5, in assert_response
    assert status in resp.status, "Expected response %r not in %r" % (status , resp.status)
AssertionError: Expected response '200' not in '500 Internal Server Error'

----------------------------------------------------------------------
Ran 4 tests in 0.562s

FAILED (failures=1) 
我的测试代码:app_tests.py

from nose.tools import *
from bin.app import app
from tests.tools import assert_response

def test_index():
    #check that we get a 404 on the / URL
    resp = app.request("/")
    assert_response(resp, status= "404")

    #test our first GET request to /hello
    resp = app.request("/hello")
    assert_response(resp)

    #make sure default values work for the form 
    resp = app.request("/hello" , method="POST")
    assert_response(resp , contains="Nobody")

    #test that we get expected values
    data = {'name':'Tejas','greet':'Ola!'}
    resp = app.request("/hello " , method= "POST", data=data)
    assert_response(resp , contains="Zed")
tools.py:

from nose.tools import *
import re

def assert_response(resp, contains=None, matches=None, headers=None, status= "200"):
    assert status in resp.status, "Expected response %r not in %r" % (status , resp.status)

    if status == "200":
        assert resp.data , "Response data is empty."

    if contains:
        assert contains in resp.data, "Response does not contain %r" % contains 

    if matches:
        reg = re.compile(matches)
        assert reg.matches(resp.data), "Response does not match %r" % matches 

    if headers:
        assert_equal(resp.headers , headers)
app.py代码:

import web 
from gothonweb import map 

urls = (
       '/game' , 'GameEngine' ,
       '/' , 'Index',
        )

app = web.application(urls, globals())
#little hack so that debug mode works with sessions
if web.config.get('_session') is None:
    store= web.session.DiskStore('sessions')
    session= web.session.Session(app, store, initializer={'room':None})
    web.config._session = session 
else:
    session= web.config._session

render = web.template.render('templates/', base="layout")   

class Index(object):
    def GET(self):
        #this is used to "setup" the session with starting values
        session.room= map.START
        web.seeother("/game")

class GameEngine(object):
    def GET(self):
        if session.room:
            return render.show_room(room= session.room)
        else:
            #why is there here? do you need it?
             return render.you_died()

    def POST(self):
        form= web.input(action=None)

        if session.room and form.action:
            session.room= session.room.go(form.action)
        else:
            session.room= None        


if __name__ == "__main__" :
    app.run()
现在继续练习后,它会给我两个导入错误:

PS C:\lpthw\gothonweb\tests> nosetests
EE
======================================================================
ERROR: Failure: SyntaxError (invalid syntax (app.py, line 2))
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\nose\loader.py", line 418, in loadTestsFromName
    addr.filename, addr.module)
  File "C:\Python27\lib\site-packages\nose\importer.py", line 47, in importFromPath
    return self.importFromDir(dir_path, fqname)
  File "C:\Python27\lib\site-packages\nose\importer.py", line 94, in importFromDir
    mod = load_module(part_fqname, fh, filename, desc)
  File "C:\lpthw\gothonweb\tests\app_tests.py", line 2, in <module>
    from bin.app import app
  File "C:\lpthw\gothonweb\bin\app.py", line 2
    from gothonweb import map.py
                             ^
SyntaxError: invalid syntax

======================================================================
ERROR: Failure: ImportError (cannot import name map)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\nose\loader.py", line 418, in loadTestsFromName
    addr.filename, addr.module)
  File "C:\Python27\lib\site-packages\nose\importer.py", line 47, in importFromPath
    return self.importFromDir(dir_path, fqname)
  File "C:\Python27\lib\site-packages\nose\importer.py", line 94, in importFromDir
    mod = load_module(part_fqname, fh, filename, desc)
  File "C:\lpthw\gothonweb\tests\map_tests.py", line 2, in <module>
    from gothonweb import map
ImportError: cannot import name map

----------------------------------------------------------------------
Ran 2 tests in 0.002s

FAILED (errors=2)
我应该做什么来修复错误?感谢您的建议。

对于此错误

“AttributeError:没有名为hello\u表单的模板”

使用绝对路径,看看是否有效,而不是

“render=web.template.render('templates/',base=“layout”)

尝试:


令人惊讶的是,您的测试与app.py无关

from nose.tools import *
from bin.app import app
from tests.tools import assert_response

def test_index():
    #check that we get a 404 on the / URL
    resp = app.request("/")
    assert_response(resp, status= "404")

    #test our first GET request to /hello
    resp = app.request("/hello")
    assert_response(resp)

    #make sure default values work for the form 
    resp = app.request("/hello" , method="POST")
    assert_response(resp , contains="Nobody")

    #test that we get expected values
    data = {'name':'Tejas','greet':'Ola!'}
    resp = app.request("/hello " , method= "POST", data=data)
    assert_response(resp , contains="Zed")
App.py

import web 
from gothonweb import map 

urls = (
       '/game' , 'GameEngine' ,
       '/' , 'Index',
        )

app = web.application(urls, globals())
#little hack so that debug mode works with sessions
if web.config.get('_session') is None:
    store= web.session.DiskStore('sessions')
    session= web.session.Session(app, store, initializer={'room':None})
    web.config._session = session 
else:
    session= web.config._session

render = web.template.render('templates/', base="layout")   

class Index(object):
    def GET(self):
        #this is used to "setup" the session with starting values
        session.room= map.START
        web.seeother("/game")

class GameEngine(object):
    def GET(self):
        if session.room:
            return render.show_room(room= session.room)
        else:
            #why is there here? do you need it?
             return render.you_died()

    def POST(self):
        form= web.input(action=None)

        if session.room and form.action:
            session.room= session.room.go(form.action)
        else:
            session.room= None        


if __name__ == "__main__" :
    app.run()
你能看出它们之间的关系吗

您的第一个测试表明您应该在“/”url上获得404,但只有在“/”不存在的情况下才会发生。您的app.py代码清楚地显示“/”在索引类中调用get。

第二个测试,
resp=app.request(“/hello”)
现在会出现404错误,因为app.py上不存在该url

第三个测试也是如此,因为app.py中的URL元组中不存在“/hello”

还有第五次测试

尽管您的测试无效,但您遇到的主要问题是试图从tests目录中执行自动测试;这是错误的

C:\lpthw\gothonweb\tests> nosetests
这不是正确的做法,您需要在下面的目录中才能进行所有导入,例如,在app_测试中,您尝试导入bin/app.py,但该目录不在“tests”目录中

改为这样做

C:\lpthw\gothonweb> nosetests
这样,您需要的所有文件都将被导入
回到app_tests.py。我将写出一个非常简单的测试,它实际上与app.py相关

 from bin.app import app
 from test.tools import assert_response

def test_index():
    #check that we get a 303 on the / url
    #this is because web.seeother() will always send the browser this http code
    resp = app.request("/")
    assert_response(resp, status= "303")

def test_game():
    #check that we get a 200 on /game
    resp = app.request("/game")
    assert_response(resp, status = '200')

    #check that we have response data on a form sumbit
    resp = app.request("/game", method = 'POST')
    aseert_response(resp.data)

您获取的断言\u错误,因为您在该目录中运行了
nosetests

/gothrowb/test

bin  docs  gothonweb  templates  tests

./bin:
app.py  app.pyc  __init__.py  __init__.pyc

./docs:

./gothonweb:
__init__.py  __init__.pyc

./templates:
hello_form.html  index.html  layout.html

./tests:
app_tests.py   __init__.py   test.html  tools.pyc
app_tests.pyc  __init__.pyc  tools.py
你应该把它放进去 /gothroweb

bin  docs  gothonweb  templates  tests

./bin:
app.py  app.pyc  __init__.py  __init__.pyc

./docs:

./gothonweb:
__init__.py  __init__.pyc

./templates:
hello_form.html  index.html  layout.html

./tests:
app_tests.py   __init__.py   test.html  tools.pyc
app_tests.pyc  __init__.pyc  tools.py

干杯

断言错误不是你的问题,而是你应该调查的属性错误。更具体地说,你的错误在app.py的第29行,代码你没有提供。我已经用app.py代码更新了它,但我认为我们必须在我做的练习中提前更改app.py,因此它与之前的app.py不同,正如我们所做的那样必须添加一些内容。您仍然会遇到错误吗?现在,当我运行nosetests时,我会遇到两个错误:两个都存在导入错误:无法从gothonweb导入地图。我无法找出错误所在,因为我认为结构正确,导入语句与书中给出的语句类似。
bin  docs  gothonweb  templates  tests

./bin:
app.py  app.pyc  __init__.py  __init__.pyc

./docs:

./gothonweb:
__init__.py  __init__.pyc

./templates:
hello_form.html  index.html  layout.html

./tests:
app_tests.py   __init__.py   test.html  tools.pyc
app_tests.pyc  __init__.pyc  tools.py