Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在单元测试中创建API资源的最佳实践-数据库还是POST端点?_Python_Flask_Restapi - Fatal编程技术网

Python 在单元测试中创建API资源的最佳实践-数据库还是POST端点?

Python 在单元测试中创建API资源的最佳实践-数据库还是POST端点?,python,flask,restapi,Python,Flask,Restapi,在RESTAPI中对GET端点进行单元测试时,创建资源的最佳实践是什么 我是否应该直接在数据库中创建它们: def test_can_get_todos_list(self): todo1 = Todo(text='todo1', user_id=self.user.id) todo2 = Todo(text='todo2', user_id=self.user.id) db.session.add_all([todo1, todo2])

在RESTAPI中对GET端点进行单元测试时,创建资源的最佳实践是什么

我是否应该直接在数据库中创建它们:

  def test_can_get_todos_list(self):

        todo1 = Todo(text='todo1', user_id=self.user.id)
        todo2 = Todo(text='todo2', user_id=self.user.id)

        db.session.add_all([todo1, todo2]) # creating expected response todos directly in the database
        db.session.commit()

        response = self.client.get('api/todos')
        result = [
            {'text': 'todo1', 'id': 1},
            {'text': 'todo2', 'id': 2},
        ]
        
        self.assertEqual(response.status_code, 200)
        self.assertEqual(result, response.json)
或者我应该利用我为创建这种类型的资源而构建的另一个API端点(POST)。因此,不要这样做:

db.session.add_all([todo1, todo2]) 
db.session.commit()
我可以这样做:

self.client.post(/api/todos, data='todos payload here')

当将API作为集成测试(即完全外部测试)进行测试时,请将API用于测试的每个部分。让某些部件使用API,而某些部件使用内部API将使测试更加脆弱(即,对任一功能的更改可能需要更新测试)

相反,测试应该使用与测试实现的功能具有相同抽象级别的API。如果您使用的是外部API,那么您应该将外部API用于测试的任何功能。这也将允许您从自己的代码外部运行测试,它们将作为如何使用API的文档和示例

以这种方式实施测试还将暴露API的任何缺陷;如果您发现了无法通过API实现但编写测试需要的功能,那么您已经找到了当前API未涵盖的用例

许多框架还具有为您设置测试环境的专用测试客户端,因此请求不必实际设置侦听套接字并运行http服务器。这会在测试外部API时加快测试速度