执行nosetests时出现Python-断言错误

时间:2016-05-13 00:05:17

标签: python-2.7 web.py

我是web.py的新手。我正在关注ex52 LPTHW,我不得不在tests文件夹中的所有测试中执行nosetests。但由于断言错误,我得到1次测试失败。我试着阅读不同的断言错误以及它们为什么会出现,但我无法弄清楚这一点。我尝试扩展服务器可能出现的错误,如500 Internal,400但它仍然没有通过测试。我已经创建了其他代码,就像书中提到的那样:http://learnpythonthehardway.org/book/ex52.html

这是我的追溯:

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()

现在继续练习后,它给了我2个导入错误:

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)

目录结构:

C:/lpthw/
    gothonweb/
    bin build dist doc sessions Gothonweb templates tests map.py app.py 
tests/
map_tests.py
app_tests.py
__init__.py
tools.py

我该怎么做才能解决错误?感谢您的建议。

3 个答案:

答案 0 :(得分:0)

对于此错误,

  

“AttributeError:没有名为hello_form的模板”

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

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

尝试:

"render = web.template.render('C:/lpthw/gothonweb/bin/templates', base="layout")

答案 1 :(得分:0)

令人惊讶的是,您的测试与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()

你能看出,他们之间没有关系吗

你的第一个测试表明你应该在'/'网址上获得404,但这只会在'/'不存在的情况下发生。您的app.py代码清楚地显示“/”在Index类中调用GET。

第二次测试resp = app.request("/hello")现在会给你一个404错误,因为app.py上不存在这个网址

第三次测试同样如此,因为app.py中的url元组中不存在'/ hello'

第五次测试以及

虽然您的测试无效,但您遇到的主要问题是尝试从tests目录中执行自动化测试;那是错的。

C:\lpthw\gothonweb\tests> nosetests

这不是正确的做法,你需要成为下面的目录才能使你的所有导入工作,例如在app_tests中你试图导入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)

答案 2 :(得分:0)

您获得的assertion_error是因为您在此目录中运行nosetests

/ gothroweb / test

你应该运行它 / 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
欢呼