在Flask单元测试中测试失败,出现404错误

时间:2020-02-27 09:54:57

标签: python unit-testing flask python-unittest

我正在运行单元测试以测试在用Postman测试时可以正常工作的API。 API接受两个参数,形式为{"body":"hey","title":"title"},这些参数根据我创建的模型将这些值添加到数据库中。从数据库获得的响应以相似的格式返回,并带有一个额外的id键。关键是它可以与Postman一起正常工作。但是,当使用Pytest进行测试时,将无法正常工作。

这是测试文件中的代码。

import os
import unittest
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# from flask_backend import app
# from flask_backend.core import db


class BasicTests(unittest.TestCase):
    app = Flask(__name__)
    db = SQLAlchemy(app)

    def setUp(self):
        file_path = os.path.abspath(os.getcwd()) + "\database_test.db"
        self.app.config['TESTING'] = True
        self.app.config['DEBUG'] = False
        self.app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + file_path
        self.app = self.app.test_client()
        self.db.drop_all()
        self.db.create_all()

    def tearDown(self):
        self.db.session.remove()


class TestApi(BasicTests):

    def test_add_post(self):
        url = 'http://127.0.0.1:5000'
        parameters = {'body': 'Body', 'title': 'title'}
        response = self.app.post(url+'/api/dbapi/post/', data=parameters)
        print(self.app)
        self.assertEqual(response.status_code, 200)


if __name__ == '__main__':
    unittest.main()

我认为在执行测试时,服务器不会启动,因此会引发404错误。

我之所以没有从项目本身导入app变量,是因为模块没有被导入。我在另一个线程中问过这个问题。这是它的链接: Can not import the files from parent directory even though it has __init__.py file in it

据我了解,如果我可以导入项目本身中使用的应用程序实例,那我应该很好,但是那也不起作用。

1 个答案:

答案 0 :(得分:0)

这是我解决问题的方法。因此,显然需要使服务器运行才能访问API并成功运行测试。

因此,我在代码末尾添加了app.run(),它工作正常。这是它的样子


    if __name__ == '__main__':
        unittest.main()
        app.run()