Home  >  Article  >  Backend Development  >  python unittest implements api automated testing_python

python unittest implements api automated testing_python

不言
不言Original
2018-04-04 16:44:551978browse

This article mainly introduces in detail the method of python unittest to implement API automated testing, which has certain reference value. Interested friends can refer to

The importance of project testing for a project , everyone should know it, friends who write python should have written automated test scripts.
Recently I am responsible for the API testing in the company's projects. Here is a simple example to sort out the API testing.

First, write the restful api interface file testpost.py, which contains get, post, and put methods

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import request
from flask_restful import Resource
from flask_restful import reqparse


test_praser = reqparse.RequestParser()
test_praser.add_argument('ddos')


class TestPost(Resource):
  def post(self, PostData):
    data = request.get_json()
    user = User('wangjing')
    if data['ddos']:
     return {'hello': 'uese', "PostData": PostData, 'ddos': 'data[\'ddos\']'}
    return {'hello': 'uese', "PostData": PostData}

  def get(self, PostData):
    data = request.args
    if data and data['ddos']:
      return "hello" + PostData + data['ddos'], 200
    return {'hello': 'uese', "PostData": PostData}

  def put(self, PostData):
    data = test_praser.parse_args()
    if data and data['ddos']:
      return "hello" + PostData + data['ddos'], 200
    return {'hello': 'uese', "PostData": PostData}

ps: For For the value of request, I have defined three commonly used methods here:

post method: request.get_json(), when calling the API, the value is passed in json mode
get and put methods :request.args or reqparse.RequestParser(), when calling the API, the string is passed

Secondly, define the Blueprint file init.py

#!/usr/bin/env python
  # -*- coding: utf-8 -*-
  from flask import Blueprint
  from flask_restful import Api
  from testpost import TestPost

  testPostb = Blueprint('testPostb', __name__)
  api = Api(testPostb)
  api.add_resource(TestPost, &#39;/<string:PostData>/postMeth&#39;)

Then, write the test script testPostM.py


##

#!/usr/bin/env python
  # -*- coding: utf-8 -*-
  import unittest
  import json
  from secautoApp.api.testPostMeth import api
  from flask import url_for
  from run import app
  from secautoApp.api.testPostMeth import TestPost

  headers = {&#39;Accept&#39;: &#39;application/json&#39;,
        &#39;Content-Type&#39;: &#39;application/json&#39;
        }

  class APITestCase(unittest.TestCase):
    def setUp(self):
      # self.app = create_app(os.getenv("SECAUTOCFG") or &#39;default&#39;)
      self.app = app
      #   self.app_context = self.app.app_context()
      #   self.app_context.push()
      self.client = self.app.test_client()

    #
    # def tearDown(self):
    #   self.app_context.pop()

    def test_post(self):
      # with app.test_request_context():

      response = self.client.get(api.url_for(TestPost, PostData=&#39;adb&#39;, ddos=&#39;123&#39;))
      self.assertTrue(response.status_code == 200)

      response = self.client.get(url_for(&#39;testPostb.testpost&#39;, PostData=&#39;adb&#39;, ddos=&#39;123&#39;))
      self.assertTrue(response.status_code == 200)  
      self.assertTrue(json.loads(response.data)[&#39;PostData&#39;] ==&#39;adb&#39;)

      response = self.client.post(url_for(&#39;testPostb.testpost&#39;, PostData=&#39;adb&#39;), headers=headers,
                    data=json.dumps({"ddos": &#39;123&#39;}))
      print json.loads(response.data)
      self.assertTrue(response.status_code == 200)

      response = self.client.put(url_for(&#39;testPostb.testpost&#39;, PostData=&#39;adb&#39;, ddos=&#39;123&#39;))
      self.assertTrue(json.loads(response.data) == &#39;helloadb123&#39;)

      response = self.client.put(url_for(&#39;testPostb.testpost&#39;, PostData=&#39;adb&#39;))
      print json.loads(response.data)[&#39;PostData&#39;]
      self.assertTrue(response.status_code == 200)

ps: The api url called mainly uses flask_restful's api.url_for, or flask's url_for. Let me talk about the specific use of these two methods

flask_restful's api.url_for description

api.url_for(TestPost,PostData='adb'), TestPost here refers to the class defined in the restful api interface file, because we have passed the api in the api blueprint .add_resource(TestPost, '//postMeth') The way to add a class has been defined


flask's url_for usage instructions

url_for('testPostb.testpost', PostData='adb', ddos='123'), 'testPostb.testpost' In the string

testPostb refers to the name of the blueprint, that is, testPostb = Blueprint( testPostb in Blueprint('testPostb', name) in 'testPostb', name).
testpost refers to the endpoint name of endpoit under the blueprint. In flask_restful, it refers to the lower case of the class name TestPost in api.add_resource(TestPost, '//postMeth')

Start the test script:

C:\secauto3>python run.py test
test_post (testPostM.APITestCase) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.056s

OK

Small summary: There is a corresponding relationship between the value passed by url_for and the value in the request. The last is The endpoint method in flask_restful must be the lower case of the class name in api.add_resource.

Related recommendations:

How to use unittest to test the interface_python

##python+requests+unittest API interface testing issues

The above is the detailed content of python unittest implements api automated testing_python. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn