續的關於測試的方法論,都是建立在之前的文章裡面提到的觀點:
本系列選擇的測試語言是 python 腳本語言。由於其官方文檔已經對原理有了比較清楚的解釋,本文就不做一些多余的翻譯工作了。偏向於實戰部分,而且為了偏向實戰,也會結合 IDE 工具和項目組織來進行講解。
理由如下:
1.腳本語言,開發和迭代的效率極高
2.第三方的擴展庫極多,有很我現成的工具可以使用
在正式進入到 自動化測試 的領域之前,先要建立這樣的價值觀。在Google內部工程師發布的軟件測試的出版物裡面提到:
“軟件的自動化測試是有成本的,而且成本不低,基本上相當於在原有的 功能開發工程 的基礎上再建立一個平行的 測試開發工程 ”。
也就是說,如果你對自動化測試有你的期望值,那麼就肯定是要付出相應的代價和精力的。好的東西也是需要優秀的人花大量的時間去完成的。
使用 python 作為自動化編程語言,那麼就自然的使用 pyunit 作為自動化測試框架了。
如下部分的內容主要來自於 pyunit 的官方文檔,本文僅僅做了一些翻譯和結構上的簡單調整。這部分屬於測試框架的基本原理和概念部分,在進行代碼編寫前,有必要進行了解。
python的單元測試框架 PyUnit,可以認為是 Java 語言下的單元測試框架 JUnit 的 Python 語言實現版本,甚至其作者之一 Kent Beck 就是 JUnit 的作者。
unittest要達到如下目標:
為了達到以上目標,unittest支持如下幾個重要概念:
如下示例也來自於官方文檔 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.多用例測試類
不同的編寫形態,會有不同的組織方式,具體的可以看官方文檔。本文作者研究過官方文檔後,最喜歡第三種方式 多用例測試類,也就是上面基本示例的方式,這種方式具有如下特點:
在控制台中運行此程序:
* 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類
既然需要開發代碼的生產力,那麼就需要介紹一款IDE工具-- Pycharm。不可否認,它是目前最專注/專業的 Python 語言的 IDE 了。在對Pyunit 也有比較好的支持。
主要支持如下:
可視化的編程開發(這是IDE的基本特點)
對測試結果進行可視化的展示
導出生成HTML的測試報告
可視化控制用例執行(這個在開發調試階段很方便,可以方便控制指定代碼單元運行)
1.讓一個目錄下的所有用命執行
2.讓單個文件內所有用例執行
3.讓單個文件內的單個用命執行
4.1 運行和調試
Pycharm 對測試腳本提供了靈活的運行和調試支持。
通過pycharm,開發人員可以不用編寫main函數,就可以實現如下功能:
其中 “運行一個測試類的某個測試腳本” 比較有用,適合在開發階段快速地對單個腳本進行開發和運行調試。
使用方法:
1.將光標移動到測試函數內部
2.按下運行快捷鍵 ctrl+shift+F10 (Eclipse快捷鍵方案)
如果要斷點調試,則使用Debug模式,即可對單個函數運行和斷點調試了。
當然,也可以不必借用IDE,而通過對testSuit操作,也可以實現以上功能,但是IDE卻提供了更靈活直接的選擇。這只是一些IDE使用技巧,也不多述了。
4.2 結果可視化
對於前面提到的例子,如果選擇在IDE中運行此程序,會看到如下效果:
可以看到全部運行通過。如果刻意將其中一個弄成不通過的,則會顯示如下的結果:
4.3 生成測試報告
Pycharm也提供了測試結果報告的導出功能,在測試結果顯示框上的一個功能按鈕上。
導出結果如下:
當然,如果不考慮和信息系統集成,不考慮後續的儀表盤和測試統計工作,僅僅只是要生成報告,這個功能已經足夠了。
一般情況下,做自動化測試和開發,上面的那些那些技能已經完全能夠滿足要求了,接下來要做的事情就是利用各種計算機基本知識,面對不斷增加的業務需求,而不斷地增加測試用例腳本了。
功能開發項目,原理都很簡單,但是隨著量的增加,都會形成規模,測試開發工程也是一樣。
之前對測試用例的 開發調試態 的工具進行了介紹。但是如果真正的要納入到 持續集成 的自動化體系,就顯然不能依賴於 IDE 了。而是使用python 語言的組織和調用方式了,比如:要有 main 函數來作為執行入口,等等。
詳細的技術實現細節,在後面有機會,將再會寫相應的文章進行介紹。
通過脫離IDE的項目組織方式,有如下優點:
關於如何自動化生成測試報告這個測試產物,現在有一些平台能夠提供接口調用及報告展示和分享功能
本小部分的內容,主要是講基於 python 語言的 自動化測試框架 pyunit的一些設計思想和基本使用示例。其實工具的使用方法很簡單,但是如何利用好這些工具來進行軟件生產,則需要其它的計算機技能了,在後續的文章中將會從工程方面和技術方面來對此框架的應用進行深入的擴展。
最後感謝每一個認真閱讀我文章的人,看著粉絲一路的上漲和關注,禮尚往來總是要有的,雖然不是什麼很值錢的東西,如果你用得到的話可以直接拿走
這些資料,對於做【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!凡事要趁早,特別是技術行業,一定要提升技術功底。希望對大家有所幫助…….