python自動化測試(3)- 自動化框架及工具

python自動化測試(3)

自動化框架及工具

1   概述

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

  • 功能測試不建議作自動化
  • 接口測試性價比最高
  • 接口測試能夠作自動化

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

本系列選擇的測試語言是 python 腳本語言。因爲其官方文檔已經對原理有了比較清楚的解釋,本文就不作一些多餘的翻譯工做了。偏向於實戰部分,並且爲了偏向實戰,也會結合 IDE 工具和項目組織來進行講解。git

理由以下:github

  1. 腳本語言,開發和迭代的效率極高
  2. 第三方的擴展庫極多,有很我現成的工具可使用

在正式進入到 自動化測試 的領域以前,先要創建這樣的價值觀。在Google內部工程師發佈的軟件測試的出版物裏面提到:數據庫

「軟件的自動化測試是有成本的,並且成本不低,基本上至關於在原有的 功能開發工程 的基礎上再創建一個平行的 測試開發工程 」。編程

也就是說,若是你對自動化測試有你的指望值,那麼就確定是要付出相應的代價和精力的。好的東西也是須要優秀的人花大量的時間去完成的。bash

 

本文已經收入合集:《基於python的互聯網軟件測試開發(自動化測試)-全集合》,歡迎訪問的查看:框架

基於Python的互聯網軟件測試開發編程語言

 

2   PyUnit測試框架

使用 python 做爲自動化編程語言,那麼就天然的使用 pyunit 做爲自動化測試框架了。ide

以下部分的內容主要來自於 pyunit 的官方文檔,本文僅僅作了一些翻譯和結構上的簡單調整。這部分屬於測試框架的基本原理和概念部分,在進行代碼編寫前,有必要進行了解。

python的單元測試框架 PyUnit,能夠認爲是 Java 語言下的單元測試框架 JUnit 的 Python 語言實現版本,甚至其做者之一 Kent Beck 就是 JUnit 的做者。

unittest要達到以下目標:

  • 支持自動化測試
  • 讓全部的測試腳本共享 開啓(setup) 和 關閉(shutdown) 的代碼
  • 能夠經過集合(collections)的方式來組織測試用例腳本
  • 將全部的測試腳本從測試報告框架中獨立出來

爲了達到以上目標,unittest支持以下幾個重要概念:

  • 測試裝置(test fixture)

    爲一個或者多個測試用例作一些準備工做,例如:鏈接一個數據庫,建立一個目錄,或者開啓一個進程

  • 測試用例(test case)

    測試用例是測試行爲的最小單元,經過對一些輸入輸出值的對比來進行測試檢查

  • 測試套件(test suite)

    將 測試用例 或者 測試用例集合 聚合組織起來的集合。能夠批量執行一個測試套件內全部的測試用例

  • 測試執行器(test runner)

    組織安排測試腳本執行活動的組件。測試執行器經過一些圖形界面,文本界面或者返回一些特殊的值來展現測試腳本的測試結果。主要用於生成測試報告

3   基本示例

以下示例也來自於官方文檔 basic_demo.py

# coding:utf-8
"""
基本的自動化測試腳本 basic_demo.py
"""
__author__ = 'zheng'

import unittest


class TestStringMethods(unittest.TestCase):

    def setUp(self):
        print 'init by setUp...'

    def tearDown(self):
        print 'end by tearDown...'

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())
        self.assertTrue('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)


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

雖然官方文檔裏面介紹了幾種組織測試用例腳本的方式:

  1. 獨立測試函數
  2. 單用例測試類
  3. 多用例測試類

不一樣的編寫形態,會有不一樣的組織方式,具體的能夠看官方文檔。本文做者研究過官方文檔後,最喜歡第三種方式 多用例測試類,也就是上面基本示例的方式,這種方式具備以下特色:

  • 測試類 繼承於 unittest.TestCase
  • 一個測試類能夠管理多個 測試腳本函數
  • 測試腳本函數名稱須要以 test_ 開頭
  • 一個測試類裏面的全部的測試函數共享 setUp和tearDown函數

在控制檯中運行此程序:

➜  src git:(master) ✗ python basic_demo.py
init by setUp...
Fend by tearDown...
init by setUp...
end by tearDown...
.init by setUp...
end by tearDown...
.
======================================================================
FAIL: test_isupper (__main__.TestStringMethods)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "basic_demo.py", line 24, in test_isupper
    self.assertTrue('Foo'.isupper())
AssertionError: False is not true

----------------------------------------------------------------------
Ran 3 tests in 0.001s

FAILED (failures=1)
➜  src git:(master) ✗

前面的基本例子的 main 函數採用的最簡單的方式,直接運行全部的測試用例,並生成默認的文本報告。其實只須要對調用函數作一些簡單的修改,能夠將這些測試用例進行合理組織,並獲取其實有用的數據信息,以便和信息系統進行集成,造成較好的擴展。

if __name__ == '__main__':
    # unittest.main()
    # 裝載測試用例
    test_cases = unittest.TestLoader().loadTestsFromTestCase(TestStringMethods)
    # 使用測試套件並打包測試用例
    test_suit = unittest.TestSuite()
    test_suit.addTests(test_cases)
    # 運行測試套件,並返回測試結果
    test_result = unittest.TextTestRunner(verbosity=2).run(test_suit)
    #生成測試報告
    print("testsRun:%s" % test_result.testsRun)
    print("failures:%s" % len(test_result.failures))
    print("errors:%s" % len(test_result.errors))
    print("skipped:%s" % len(test_result.skipped))

運行後生成的輸出爲:

➜  src git:(master) ✗ python basic_demo.py
test_isupper (__main__.TestStringMethods) ... init by setUp...
FAIL
end by tearDown...
test_split (__main__.TestStringMethods) ... init by setUp...
end by tearDown...
ok
test_upper (__main__.TestStringMethods) ... init by setUp...
end by tearDown...
ok

======================================================================
FAIL: test_isupper (__main__.TestStringMethods)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "basic_demo.py", line 23, in test_isupper
    self.assertTrue('Foo'.isupper())
AssertionError: False is not true

----------------------------------------------------------------------
Ran 3 tests in 0.001s

FAILED (failures=1)
testsRun:3
failures:1
errors:0
skipped:0

顯然上面的輸入結果已經將測試的結果進行了統計,這些數據都是一次測試活動中的重要指標,這些數據能夠入庫,和測試信息管理系統集成,後期生成儀表盤或者統計報表,造成穩定和產品測試線路圖,這些都是和開發相關的了,在此再也不多敘述了。

結合上面的具體例子,咱們也能夠找到上一節的理論部分對應的具體實現對象:

  • 測試裝置(test fixture)

    由setUp函數來作初始化工做,由tearDown作銷燬工做

  • 測試用例(test case)

    對應TestCase類,或者更細化的對應裏面的測試腳本函數

  • 測試套件(test suite)

    對應TestSuite類

  • 測試執行器(test runner)

    對應TextTestRunner類

4   IDE工具

既然須要開發代碼的生產力,那麼就須要介紹一款IDE工具-- Pycharm。不能否認,它是目前最專一/專業的 Python 語言的 IDE 了。在對Pyunit 也有比較好的支持。

主要支持以下:

  • 可視化的編程開發(這是IDE的基本特色)

  • 對測試結果進行可視化的展現

  • 導出生成HTML的測試報告

  • 可視化控制用例執行(這個在開發調試階段很方便,能夠方便控制指定代碼單元運行)
    • 讓一個目錄下的全部用命執行
    • 讓單個文件內全部用例執行
    • 讓單個文件內的單個用命執行

4.1   運行和調試

Pycharm 對測試腳本提供了靈活的運行和調試支持。

經過pycharm,開發人員能夠不用編寫main函數,就能夠實現以下功能:

  • 運行一個文件下全部的測試類
  • 運行一個測試類的全部測試腳本
  • 運行一個測試類的某個測試腳本

其中 "運行一個測試類的某個測試腳本" 比較有用,適合在開發階段快速地對單個腳本進行開發和運行調試。

使用方法:

  1. 將光標移動到測試函數內部
  2. 按下運行快捷鍵 ctrl+shift+F10 (Eclipse快捷鍵方案)

若是要斷點調試,則使用Debug模式,便可對單個函數運行和斷點調試了。

固然,也能夠沒必要借用IDE,而經過對testSuit操做,也能夠實現以上功能,可是IDE卻提供了更靈活直接的選擇。這只是一些IDE使用技巧,也很少述了。

4.2   結果可視化

對於前面提到的例子,若是選擇在IDE中運行此程序,會看到以下效果:

能夠看到所有運行經過。若是刻意將其中一個弄成不經過的,則會顯示以下的結果:

4.3   生成測試報告

Pycharm也提供了測試結果報告的導出功能,在測試結果顯示框上的一個功能按鈕上。
 
導出結果以下:
 
固然,若是不考慮和信息系統集成,不考慮後續的儀表盤和測試統計工做,僅僅只是要生成報告,這個功能已經足夠了。

通常狀況下,作自動化測試和開發,上面的那些那些技能已經徹底可以知足要求了,接下來要作的事情就是利用各類計算機基本知識,面對不斷增長的業務需求,而不斷地增長測試用例腳本了。

功能開發項目,原理都很簡單,可是隨着量的增長,都會造成規模,測試開發工程也是同樣。

5   項目組織

以前對測試用例的 開發調試態 的工具進行了介紹。可是若是真正的要歸入到 持續集成 的自動化體系,就顯然不能依賴於 IDE 了。而是使用python 語言的組織和調用方式了,好比:要有 __main__ 函數來做爲執行入口,等等。

詳細的技術實現細節,在後面有機會,將再會寫相應的文章進行介紹。

經過脫離IDE的項目組織方式,有以下優勢:

  • 能夠經過事件觸發來執行全部腳本(可以成爲 持續集成 流水線的一環節)
  • 能夠將數據所有提出並進行自定義加工和處理(和測試信息系統集成,爲質量分析系統提供數據源)

 

6  測試平臺

 

關於如何自動化生成測試報告這個測試產物,如今有一些平臺可以提供接口調用及報告展現和分享功能,詳情參考:

http://www.jianshu.com/p/c5fa76cf87db

 

 

7  小結

本小部分的內容,主要是講基於 python 語言的 自動化測試框架 pyunit的一些設計思想和基本使用示例。其實工具的使用方法很簡單,可是如何利用好這些工具來進行軟件生產,則須要其它的計算機技能了,在後續的文章中將會從工程方面和技術方面來對此框架的應用進行深刻的擴展。

(未完,待續。。。。)


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