最近一直在學習和整理web開發與接口測試的相關資料。接口測試自己毫無任何難度,甚至有不少工具和類庫來幫助咱們進行接口測試。大多測試人員很難深刻了解web接口測試的緣由是對web開發不太瞭解,當你越瞭解開發就會越看得清接口是什麼。固然,web開發是比較麻煩,咱們很難一會兒掌握。css
注:不過本文並非一個零基礎的文章,須要你對 Django web開發,requests接口庫,unittest單元測試框架,三者有必定的瞭解。html
以前分享過一篇Django開發投票系統的例子。今天在這個例子上作一些延伸,來說講web接口的開發與測試。web
開發投票系統接口 django
雖然投票系統的的功能已經開發完成,但咱們並無開發專門的接口,在當前的投票系統中,在咱們調用一個get或post請求時,系統會返回整個頁面,而且把測試連同頁面一塊兒返回。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>© 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()
接口用例測試自己的編寫是簡單的,咱們只用調用接口,傳遞不一樣的參數。從而驗證返回值是否符合預期便可。