Python Flask单元测试中登录测试失败

Python Flask单元测试中登录测试失败,python,python-2.7,unit-testing,flask,Python,Python 2.7,Unit Testing,Flask,我正在尝试测试Python Flask应用程序的登录功能 我创建了一个用户,并将其添加到test\u adduser()test中的数据库中,结果很好。但是,test\u login()测试失败,并出现断言错误。我已经调试了代码,测试加载了登录页面ok(因此我知道问题不在于应用程序或路由等),但它不会登录并重定向用户 我意识到这篇文章的描述有点短,即错误跟踪,但是错误的字面意思是“断言错误” 也许我做了一些明显错误的事情,比如我将用户凭证传递给测试的方式,有人会向我指出这一点 谢谢 from f

我正在尝试测试Python Flask应用程序的登录功能

我创建了一个用户,并将其添加到
test\u adduser()
test中的数据库中,结果很好。但是,
test\u login()
测试失败,并出现断言错误。我已经调试了代码,测试加载了登录页面ok(因此我知道问题不在于应用程序或路由等),但它不会登录并重定向用户

我意识到这篇文章的描述有点短,即错误跟踪,但是错误的字面意思是“断言错误”
也许我做了一些明显错误的事情,比如我将用户凭证传递给测试的方式,有人会向我指出这一点

谢谢

from flask.ext.testing import TestCase
from flask import Flask
from Shares import db, app as appy
from Shares.models import User
import manage


class test(TestCase):

def create_app(self):
    app = Flask(__name__)
    app.config['TESTING'] = True
    return appy

SQLALCHEMY_DATABASE_URI = "sqlite://"
TESTING = True

def setUp(self):

    manage.initdb()
    #print self.login('lucas', 'test').data

def tearDown(self):

    db.session.remove()
    db.drop_all()

def login(self, username, password):
    return self.client.post('/login', data=dict(
        username=username,
        password=password
    ), follow_redirects=True)

def logout(self):
    return self.client.get('/logout', follow_redirects=True)

def test_adduser(self):

    lucas=User(username="lucas", email="lucas@example.com", password="test")
    user2 = User(username="lucas", email="lucas@test.com")

    db.session.add(lucas)
    db.session.commit()

    assert lucas in db.session
    assert user2 not in db.session

def test_login(self):
    lucas=User(username="lucas", email="lucas@example.com", password="test")
    db.session.add(lucas)

    rv = self.login('lucas', 'test')
    assert 'Welcome' in rv.data

好的,所以我最终解决了这个问题。我需要停用CSRF保护。这就成功了:

def create_app(self):
    app = Flask(__name__)
    appy.config['TESTING'] = True
    appy.config['WTF_CSRF_ENABLED'] = False
    return appy

在测试之间重置数据库。除非
manage.initdb
插入用户,否则您没有用户可登录
test\u login
。谢谢,manage.initdb确实添加了一个用户,但我在这里编辑了代码以澄清这一点。如果
manage.initdb
添加了一个与
test\u login
中的用户匹配的用户,
test\u adduser
应违反用户名约束。而且,
test\u adduser
实际上并不测试您的应用程序;它测试炼金术。SQLAlchemy有自己的测试。您不需要将其作为测试套件的一部分进行测试。谢谢,很抱歉我不清楚,最初用户是在manage.initdb()中添加的,但为了更清楚,我将其移动到了测试文件中。我不小心把它从代码中漏掉了,所以不清楚。上面编辑的代码是我现在拥有的,但仍然不起作用。感谢SQLAlchemy测试的帮助,我相信你可以看到我在这里有点像n00b,所以这是我一定要研究的:)rv.data的价值是什么?不知道你是如何计算出来的,但它对我帮助很大。禁用WTF CSRF检查也帮了我。谢谢