python自動化測試(4)-使用第三方python庫技術實現

python自動化測試(4)-使用第三方python庫技術實現

 

1   概述

關於測試的方法論,都是創建在以前的文章裏面提到的觀點:javascript

  • 功能測試不建議作自動化
  • 接口測試性價比最高
  • 接口測試能夠作自動化
  • 作好接口自動化,必定要有透過界面看到數據本質的能力

後面所談到的 測試自動化 也將圍繞着 接口自動化 來介紹。html

2   可測試架構

目前互聯網行業流行的「一服務,多客戶端」的架構是一種 可測試性好 的架構,架構圖以下:java


  1. 服務器和客戶端採用Http(或者WebSocket)的方式進行通信
  2. 數據交換的格式通常是Json(或者XML)
  3. 由於下游設備衆多,因此服務端接口有很強的穩定性要求

3   自動化技術實現

基於如上特色,此係統的接口自動化測試簡化表述,就是須要作以下事情:python

  1. 使用腳本對接口進行Http請求
  2. 對返回值解析
  3. 按照設計文檔進行斷定
  4. 以項目的方式組織測試腳本造成自動化測試項目

固然,以上純粹是從技術的角度來闡述問題,若是要和具體的項目結合起來 ,還須要設計不一樣的步驟和數據來知足不一樣的業務邏輯需求。git

對於如上4個目的,有以下幾個框架或者工具能夠實現:github

  1. requests

    一個Http請求庫,號稱是讓Http的請求對人更友好,此框架也確實達到此目的了。json

  2. json

    python提供的對json和python數據類型的轉化庫bash

  3. pyunit

    pyunit自動化框架提供了大量的assert斷言方法來自動化進行數據邏輯斷定服務器

  4. pycharm

    做爲一個強大的IDE,其在項目組織方面的表現也一樣是極其出色的架構

關於 pyunit 和 pycharm 在本系列文章的上一節裏面已經進行了介紹,此處再也不重複介紹,本文的重點則是python的兩個和http通信及數據解析相關的庫:requests庫 和 json庫 。

4   json

4.1   基本介紹

中文官方主頁:

http://www.json.org/json-zh.html

關於JSON的使用介紹,目前已經不言而喻。雖然在好多年前,曾經有XML和JSON在 數據編解碼 領域勢均力敵的說法,可是這麼多年過去後,JSON的勢頭愈來愈好,而XML的聲音則愈來愈小。

關於JSON的定義,引用官網的原文 [1]

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。 易於人閱讀和編寫。同時也易於機器解析和生成。 它基於JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。 JSON採用徹底獨立於語言的文本格式,可是也使用了相似於C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 這些特性使JSON成爲理想的數據交換語言。

目前JSON顯然已經成爲了互聯網上字符型數據交換的標準編解碼的中堅力量,做爲互聯網的開發人員,是頗有必要了解它,運用它的。

JSON做爲一種字符串的編碼和解碼規劃,是和語言無關的,JSON官網 [1] 上有各類語言的。各類語言(Java/Php/C#/C/C++/Python/R/Ruby等等)都有本身的實現方式,這些也均可以參考

4.2   python庫

本文的主打語言是Python語言,所展開的內容也是和Python語言相關,在JSON官網 [1] 上提供了以下幾種Python語言的JSON庫:

  • The Python Standard Library.
  • simplejson.
  • pyson.
  • Yajl-Py.
  • ultrajson.
  • metamagic.json.

通常狀況下,都使用第一個: The Python Standard Library(Python標準庫)

官方文檔地址:

https://docs.python.org/2/library/json.html

主要的功能就是:JSON編碼和解碼。

主要函數:

  • 解碼函數(裝載):將字符流轉化爲json對象
    • loads: 載入字符串變量
    • load:載入文件流
  • 編碼函數(卸載):將json對象轉化爲字符流
    • dumps:輸出到字符串變量
    • dump:輸出到文件流

以上的幾個接口容易混淆記憶,引處提供一個辨識技巧:後面帶有s結尾(loads,dumps),都是對字符串變量 str 的處理。

通常狀況下,loads,dumps使用得最多,由於大部分的程序運算都是內存運算,即主要是對字符串變量進行處理,如下是官網的示例。

字符串解碼:

>>> import json
>>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
[u'foo', {u'bar': [u'baz', None, 1.0, 2]}]
>>> json.loads('"\\"foo\\bar"')
u'"foo\x08ar'

字符串編碼:

>>> import json
>>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
'["foo", {"bar": ["baz", null, 1.0, 2]}]'
>>> print json.dumps("\"foo\bar")
"\"foo\bar"
>>> print json.dumps(u'\u1234')
"\u1234"

關於python標準數據類型和Json的數據類型之間轉化的對應關係請見官網 [2]

[1] (123) JSON官網
[2] Python的Json編碼解碼數據對應表

5   requests

5.1   基本介紹

官方主頁:

http://docs.python-requests.org/en/master/

requests庫是一個專門封裝的,對用戶極其友好的一個Http請求庫,其目的就是爲了讓python下面的Http請求變得更簡單,並且它確實也達到它的目的了。

安裝方法:

pip install requests

5.2   使用示例

目前的通常的Web應用程序都是基於get或者post請求,對於這兩種Http請求,requests庫都提供了十分優雅的解決方案。

最基本的get請求

# coding:utf-8
import requests

__author__ = 'harmo'


def get_demo():
    """
    requests 的get方法演示,不帶參數
    by:Harmo
    :return:
    """
    url = 'http://www.baidu.com'
    res = requests.get(url)
    print res.url
    print res.status_code


if __name__ == '__main__':
    get_demo()

運行結果:

http://www.baidu.com/
200

帶參數的get請求:

>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.get('http://httpbin.org/get', params=payload)

帶參數的post請求:

>>> payload = {'key1': 'value1', 'key2': 'value2'}

>>> r = requests.post("http://httpbin.org/post", data=payload)
>>> print(r.text)
{
  ...
  "form": {
    "key2": "value2",
    "key1": "value1"
  },
  ...
}

6   綜合示例

再結合一下pyunit的判斷庫,就能夠根據以下流程,作一個最簡單的接口自動化測試腳本:

  1. 根據文檔準備好請求參數
  2. 對指定的http接口進行requests請求
  3. 對返回的字符串進行json解析
  4. 使用pyunit的assert函數進行斷定
  5. 生成相應的測試報告,導出或者和信息系統對接

下面是對一個用戶登陸的接口進行測試,按照設計文檔,此接口若是登陸成功,則返回的字符格式是:

{
    "code":200,
    "msg":"",
    "data":{
        "token": "382998dafa5143fd8a38c535be0d1502"
    }
}

若是登陸失敗,則返回以下值:

{"code":403,"msg":"forbidden","data":""}

則相應的測試腳本代碼爲

def test_admin_user_login(self):
    """
    測試用戶登陸
    by:Harmo
    :return:
    """

    url = "%s%s" % (self.base_url, '/task/admin-user-login/')

    params = dict(
        user='admin',
        password='222222',

    )

    res = requests.post(url, data=params)
    print res.text

    res_dict = json.loads(res.text)
    self.assertEqual(res_dict['code'], 200)

運行結果:

經過上面運行結果的提示,咱們能夠看出,指定的數據輸入通過服務端接口後,並無返回咱們指望的值。這個時候,咱們就能夠排查是否是服務端的接口出問題了,或者是誰修改了測試數據,致使結果不符合預期。

7   小結

本小部分的內容,主要是講如何利用 requests庫 和 json庫 來輕鬆構建Http接口自動化測試的項目。基本上若是掌握瞭如上技能,測試開發人員就具有了自動化腳本開發的能力了,後面主就是結合具體的項目需求來進行邏輯設計和數據準備了。

只須要這一步,你就邁入了自動化測試之門了,恭喜。

積少成多,無數的上文提到的接口自動化測試腳本,就能夠聚集成一個自動化化測試項目,而此自動化測試項目則是 持續集成,快速迭代必備條件,最後做爲測試人員也能成爲整個項目推動中很重要的一環了。


做者: Harmo哈莫
做者介紹: https://zhengwh.github.io
技術博客: http://www.cnblogs.com/beer
Email: dreamzsm@gmail.com
QQ: 1295351490
時間: 2016-02
版權聲明: 歡迎以學習交流爲目的讀者隨意轉載,可是請 【註明出處】
支持本文: 若是文章對您有啓發,能夠點擊博客右下角的按鈕進行 【推薦】
相關文章
相關標籤/搜索