Unit testing 如何在Flask中对路由进行单元测试

Unit testing 如何在Flask中对路由进行单元测试,unit-testing,flask,routes,flask-wtforms,Unit Testing,Flask,Routes,Flask Wtforms,我一直在用Flask做实验,跟随Corey Schafer在Youtube上的一系列节目。我试图打破一些概念,构建一个非常简单的密码应用程序 到目前为止,它工作正常,但我想知道如何构建测试来确保它验证密码基本密码的有效性。(这不是测试密码匹配) 显然,在应用程序中,它会确认密码是否符合最低标准,即DataRequired()和Length(min=8) 但是我如何在单元测试模块中确认它是正确的呢?我很难想象如何构建它 您可以在此处找到回购协议: 我的代码的基本格式主要是注册表和呈现功能的实际路径

我一直在用Flask做实验,跟随Corey Schafer在Youtube上的一系列节目。我试图打破一些概念,构建一个非常简单的密码应用程序

到目前为止,它工作正常,但我想知道如何构建测试来确保它验证密码基本密码的有效性。(这不是测试密码匹配)

显然,在应用程序中,它会确认密码是否符合最低标准,即
DataRequired()
Length(min=8)

但是我如何在单元测试模块中确认它是正确的呢?我很难想象如何构建它

您可以在此处找到回购协议:

我的代码的基本格式主要是注册表和呈现功能的实际路径

密码_tester.py

from flask import Flask, render_template, flash
from forms import RegistrationForm

app = Flask(__name__)
app.config['SECRET_KEY'] = '5791628bb0b13ce0c676dfde280ba245'


@app.route("/")
@app.route("/register", methods=['GET', 'POST'])
def register():
    form = RegistrationForm()
    if form.validate_on_submit():
        flash(f'Sucess!', 'success')
    return render_template('register.html', title='Register', form=form)

if __name__ == '__main__':
    app.run(debug=True)
forms.py

from flask_wtf import FlaskForm
from wtforms import PasswordField, SubmitField
from wtforms.validators import DataRequired, Length


class RegistrationForm(FlaskForm):
    password = PasswordField('Password', validators=[DataRequired(), Length(min=8)])
    submit = SubmitField('Submit')
我尝试过的测试 我尝试了以下代码作为测试。但是状态码总是一样的,不管我把密码改成什么。。。因此,我并不真正理解如何实际测试结果

def test_pass_correct(self):
        tester = app.test_client(self)
        response = tester.post('/register', data=dict(password=''))
        self.assertEqual(response.status_code, 200)

这不是很优雅,但在我的html模板中,如果有错误消息,我会打印出错误消息。我可以测试消息是否在HTML语句中的某个地方

因此,类似这样的方法似乎有效:

# Ensure that the password-tester behaves correctly given correct credentials
    def test_pass_correct(self):
        tester = app.test_client(self)
        response = tester.post('/register', data=dict(password='testtest'))
        self.assertFalse(b'Field must be at least 8 characters long.' in response.data)

    # Ensure that the password-tester behaves correctly given incorrect credentials
    def test_pass_incorrect(self):
        tester = app.test_client(self)
        response = tester.post('/register', data=dict(password='test'))
        self.assertTrue(b'Field must be at least 8 characters long.' in response.data)

Flask网站详细介绍了将
pytest
与应用程序工厂模式结合使用的方法:实现应用程序工厂模式要求您在函数中拥有应用程序的创建代码;关于这一点的更多信息:您是否在问如何测试
DataRequired
Length
工作?@SuperShoot,是的,没错。在我看来,测试上游库功能并不完全取决于您
wtforms
是一个成熟的开放源码库,您可以查看并满意(或不满意)它们是否足够。如果你不满意,你可以在自己的测试中测试自己的应用程序功能。例如,使用ping命令将请求ping到您的注册端点(密码无效),并确保注册被拒绝,并提供适当的用户反馈。我一直在尝试ping它,但到目前为止,它默认总是返回200。。。当我手动运行它时,它会按照我的指示正确闪烁并显示错误。但我无法获得一个一致的状态代码来发布,以表明成功或失败。