前文已介紹了http相關的基礎知識概念,現在我們以實際的Python代碼形式來實現一個簡單的http的服務端和客戶端,並通過unittest框架實現一個簡單的http接口測試用例
1)首先我們通過Python的socket模塊來建一個http的服務端
__author__ = '27231'
#coding:utf-8
import socket
#http頭信息
header = """\
HTTP/1.1 200 OK
Context-Type: text/html;char
Server: Python-slp version 1.0
Context-Length:\
"""
#組裝http格式數據
def http_data(header,datafile):
fp = file(datafile)
context = fp.readlines()
context = ''.join(context)
data = "{0} {1}\n\n{2}\n\n".format(header,len(context),context)
return data
# 基礎參數
HOST = '10.33.6.205'
PORT = 8090
# 創建套接字
s_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s_socket.bind((HOST,PORT))
s_socket.listen(2)
flag = True
while flag:
if flag:
conn,addr = s_socket.accept()
print 'Connected by',addr
flag = False
data = conn.recv(1024)
if not data:
print "Connect closed,start accept a new connect"
flag = True
continue
conn.sendall(http_data(header,'index.html'))
conn.close()
2)我們再來個http的客戶端
__author__ = '27231'
#coding:utf-8
import httplib2
header = {
"Accept": "image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, */*",
"Accept-Language": "zh-CN",
"User-Agent": "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727)",
"Accept-Encoding": "gzip, deflate",
"Host": "10.33.6.205:8090",
"Connection": "Keep-Alive"
}
http = httplib2.Http()
resp,body = http.request("http://10.33.6.205:8090/","POST",body = "123",headers = header)
print resp,body
3)我們先在瀏覽器中打開這個頁面試試
使用chrome瀏覽器輸入IP:端口
用wireshark瞅瞅這個交互數據是什麼樣子的
對比wireshark抓包中,服務端返回200ok的頭信息和數據可知,頭和body一起即爲我們在http服務端組裝的一個文本數據,該文本數據通過socket中的tcp方式發送給web;由此可知http作爲應用層的一種協議,其實就是一種文本的交互格式,網絡傳輸基於socket的tcp或udp
http協議結構
headers(頭信息,有相應字段規範)
\n\n(空一行即兩個換行符)
Body(協議數據部分)
3)我們再通過Python的unitttest單元測試框架,來測試我們這個搭建的http服務
__author__ = '27231'
#coding:utf-8
import httplib2
import unittest
import urllib
class httptest(unittest.TestCase):
def test_1(self):
Http = httplib2.Http() #創建http實例
resp,message = Http.request("http://10.33.6.205:8090","POST",body="123") #發送http請求
print resp,message #輸出返回頭及body
self.assertEqual(200,resp.status) #斷言判斷返回結果
self.assertIn("login name",message) #斷言判斷返回結果
到此我們一個簡單的http接口測試用例編寫結束
接下來我們將利用Python的文件操作、日誌操作等將接口測試相關的數據做相應抽離,並生成html格式的測試報告
待續。。。