web接口開發與測試

 

  最近一直在學習和整理web開發與接口測試的相關資料。接口測試自己毫無任何難度,甚至有不少工具和類庫來幫助咱們進行接口測試。大多測試人員很難深刻了解web接口測試的緣由是對web開發不太瞭解,當你越瞭解開發就會越看得清接口是什麼。固然,web開發是比較麻煩,咱們很難一會兒掌握。css

 

注:不過本文並非一個零基礎的文章,須要你對 Django web開發,requests接口庫,unittest單元測試框架,三者有必定的瞭解。html

 

Django快速開發之投票系統

  以前分享過一篇Django開發投票系統的例子。今天在這個例子上作一些延伸,來說講web接口的開發與測試。web

 

 

開發投票系統接口                                                     django

 

  雖然投票系統的的功能已經開發完成,但咱們並無開發專門的接口,在當前的投票系統中,在咱們調用一個getpost請求時,系統會返回整個頁面,而且把測試連同頁面一塊兒返回。json

  例如,當咱們要調用全部問題的接口時(test_get.py)bootstrap

import requests

base_url = 'http://127.0.0.1:8000/polls'
r = requests.get(base_url)
code = r.status_code
text = r.text
print(code)
print(text)

獲得以下結果:瀏覽器

200

<html lang="zh-CN">
  <head>
    <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
    <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
    
  </head>
  <body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <a class="navbar-brand" href="#">Polls System</a>
        </div>
      </div>
    </nav>

    <br><br>
   <div class="well">
      <h3>Question List:</h3>       
          <ul>
             <li><a href="/polls/1/">十一國慶七天假期作什麼?</a></li>
             <li><a href="/polls/2/">你最想學的自動化工具是什麼?</a></li>
          </ul>
    </div>

      <footer>
        <p>&copy; Company 2016 & chongshi</p>
      </footer>

  </body>
</html>

   而特有的接口應該返回的是數據,而不是整個頁;而數據通常格式爲Json格式。因此,須要對試圖層(.../polls/views.py)進行改造,使其只提供接口,並單純的返回數據。框架

 

from django.shortcuts import render, get_object_or_404
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from .models import Question, Choice
from django.http import HttpResponse
import json


# Create your views here.
# 查看全部問題
def index(request):
    latest_question_list = Question.objects.all()
    dicts = {}
    if latest_question_list:
        for question in latest_question_list:
            dicts[question.id] = question.question_text
        j = json.dumps(dicts)
        return HttpResponse(j)
    else:
        return HttpResponse("question list null")


# 查看單個問題選項
def detail(request, question_id):
    choices = Choice.objects.filter(question_id=question_id)
    dicts = {}
    print(question_id)
    if question_id:
        for choice in choices:
            dicts[choice.id] = choice.choice_text
        j = json.dumps(dicts)
        return HttpResponse(j)

.....

   爲了節省時間,暫時先對查看全部問題、單個問題的全部選項兩個功能進行接口改造,固然這裏的改造也不夠完整和健壯。例如單個問題的全部選項的接口,接收的參數question_id 若是爲空,應該提示,參數錯誤。若是查詢不到相關問題,應該提示,查詢結果爲空,若是傳的類型不爲數字,應該提示,類型錯誤。這些都是一個健壯的接口應有的處理邏輯。工具

 

再次執行test_get.py文件。post

200

{"1": "\u5341\u4e00\u56fd\u5e86\u4e03\u5929\u5047\u671f\u505a\u4ec0\u4e48\uff1f", "2": "\u4f60\u6700\u60f3\u5b66\u7684\u81ea\u52a8\u5316\u5de5\u5177\u662f\u4ec0\u4e48\uff1f"}

   這一次獲得的就是json類型的數據了。不過,返回值對中文進行了unicode的編碼。這裏提供個小技巧,將其轉換成中文。

  打開Firefox瀏覽器的Firebug工具,切換到「控制檯」標籤。

 

 

 

編寫接口文檔                                                         

  

  編寫接口文檔也是很是重要的一個環節,由於咱們編寫的接口是須要給別人調用的,那麼別人如何知道咱們的接口是用get仍是post調用呢?參數都有哪些?固然須要參考接口文檔了。

一、獲取全部問題

url

http://127.0.0.1:8000/polls

請求類型

get

須要參數

返回格式

json

返回結果

{"1": "十一國慶七天假期作什麼?", 

"2": "你最想學的自動化工具是什麼?"

}

錯誤類型

暫無(接口代碼須要補充邏輯)

 

二、獲取單個問題的全部選項

url

http://127.0.0.1:8000/polls/

請求類型

get

須要參數

question_id

 

返回格式

json

 

返回結果

{"1": "旅行",

 "2":"看電影" ,

 "3":"看書

}

錯誤類型

暫無(接口代碼須要補充邏輯)

……

  好啦!接口文檔的大致結構就是上面的樣子。有了這個份文檔,咱們接下來就很容易知道如何調用這些接口作測試了。

 

 

系統接口測試                                                          

 

  對於編寫接口測試來講,咱們會涉及到兩個技術。前面也都有過簡單介紹,unittest單元測試框架和request庫。

 

import unittest
import requests


class PollsTest(unittest.TestCase):

    def setUp(self):
        self.base_url = 'http://127.0.0.1:8000/polls'
    
    def tearDown(self):
        pass
    
    def test_get_poll_index(self):
        '''測試投票系統首頁'''
        r = requests.get(self.base_url)
        code = r.status_code
        text = r.text
        self.assertEqual(code, 200)


    def test_get_poll_question(self):
        '''得到問題1的全部選項'''
        r = requests.get(self.base_url+'/1/')
        code = r.status_code
        text = r.text
        self.assertEqual(code, 200)
        self.assertIn("3",text)

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

 

  接口用例測試自己的編寫是簡單的,咱們只用調用接口,傳遞不一樣的參數。從而驗證返回值是否符合預期便可。

相關文章
相關標籤/搜索