1???概述
手續(xù)的關(guān)于測試的方法論,都是建立在之前的文章里面提到的觀點:
- 功能測試不建議做自動化
- 接口測試性價比最高
- 接口測試可以做自動化
后面所談到的?測試自動化?也將圍繞著?接口自動化?來介紹。
本系列選擇的測試語言是 python 腳本語言。由于其官方文檔已經(jīng)對原理有了比較清楚的解釋,本文就不做一些多余的翻譯工作了。偏向于實戰(zhàn)部分,而且為了偏向?qū)崙?zhàn),也會結(jié)合 IDE 工具和項目組織來進(jìn)行講解。
理由如下:
腳本語言,開發(fā)和迭代的效率極高
第三方的擴展庫極多,有很我現(xiàn)成的工具可以使用
在正式進(jìn)入到 自動化測試 的領(lǐng)域之前,先要建立這樣的價值觀。在Google內(nèi)部工程師發(fā)布的軟件測試的出版物里面提到:
“軟件的自動化測試是有成本的,而且成本不低,基本上相當(dāng)于在原有的 功能開發(fā)工程 的基礎(chǔ)上再建立一個平行的 測試開發(fā)工程 ”。
也就是說,如果你對自動化測試有你的期望值,那么就肯定是要付出相應(yīng)的代價和精力的。好的東西也是需要優(yōu)秀的人花大量的時間去完成的。
2???PyUnit測試框架
使用?python?作為自動化編程語言,那么就自然的使用?pyunit?作為自動化測試框架了。
如下部分的內(nèi)容主要來自于 pyunit 的官方文檔,本文僅僅做了一些翻譯和結(jié)構(gòu)上的簡單調(diào)整。這部分屬于測試框架的基本原理和概念部分,在進(jìn)行代碼編寫前,有必要進(jìn)行了解。
python的單元測試框架 PyUnit,可以認(rèn)為是 Java 語言下的單元測試框架 JUnit 的 Python 語言實現(xiàn)版本,甚至其作者之一 Kent Beck 就是 JUnit 的作者。
unittest要達(dá)到如下目標(biāo):
支持自動化測試
讓所有的測試腳本共享 開啟(setup) 和 關(guān)閉(shutdown) 的代碼
可以通過集合(collections)的方式來組織測試用例腳本
將所有的測試腳本從測試報告框架中獨立出來
為了達(dá)到以上目標(biāo),unittest支持如下幾個重要概念:
測試裝置(test fixture)
為一個或者多個測試用例做一些準(zhǔn)備工作,例如:連接一個數(shù)據(jù)庫,創(chuàng)建一個目錄,或者開啟一個進(jìn)程
測試用例(test case)
測試用例是測試行為的最小單元,通過對一些輸入輸出值的對比來進(jìn)行測試檢查
測試套件(test suite)
將 測試用例 或者 測試用例集合 聚合組織起來的集合??梢耘繄?zhí)行一個測試套件內(nèi)所有的測試用例
測試執(zhí)行器(test runner)
組織安排測試腳本執(zhí)行活動的組件。測試執(zhí)行器通過一些圖形界面,文本界面或者返回一些特殊的值來展示測試腳本的測試結(jié)果。主要用于生成測試報告
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()
雖然官方文檔里面介紹了幾種組織測試用例腳本的方式:
獨立測試函數(shù)
單用例測試類
多用例測試類
不同的編寫形態(tài),會有不同的組織方式,具體的可以看官方文檔。本文作者研究過官方文檔后,最喜歡第三種方式 多用例測試類,也就是上面基本示例的方式,這種方式具有如下特點:
測試類 繼承于 unittest.TestCase
一個測試類可以管理多個 測試腳本函數(shù)
測試腳本函數(shù)名稱需要以 test_ 開頭
一個測試類里面的所有的測試函數(shù)共享 setUp和tearDown函數(shù)
在控制臺中運行此程序:
? 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?函數(shù)采用的最簡單的方式,直接運行所有的測試用例,并生成默認(rèn)的文本報告。其實只需要對調(diào)用函數(shù)做一些簡單的修改,可以將這些測試用例進(jìn)行合理組織,并獲取其實有用的數(shù)據(jù)信息,以便和信息系統(tǒng)進(jìn)行集成,形成較好的擴展。
if __name__ == '__main__':
# unittest.main()
# 裝載測試用例
test_cases = unittest.TestLoader().loadTestsFromTestCase(TestStringMethods)
# 使用測試套件并打包測試用例
test_suit = unittest.TestSuite()
test_suit.addTests(test_cases)
# 運行測試套件,并返回測試結(jié)果
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
顯然上面的輸入結(jié)果已經(jīng)將測試的結(jié)果進(jìn)行了統(tǒng)計,這些數(shù)據(jù)都是一次測試活動中的重要指標(biāo),這些數(shù)據(jù)可以入庫,和測試信息管理系統(tǒng)集成,后期生成儀表盤或者統(tǒng)計報表,形成穩(wěn)定和產(chǎn)品測試線路圖,這些都是和開發(fā)相關(guān)的了,在此不再多敘述了。
結(jié)合上面的具體例子,我們也可以找到上一節(jié)的理論部分對應(yīng)的具體實現(xiàn)對象:
測試裝置(test fixture)
由setUp函數(shù)來做初始化工作,由tearDown做銷毀工作
測試用例(test case)
對應(yīng)TestCase類,或者更細(xì)化的對應(yīng)里面的測試腳本函數(shù)
測試套件(test suite)
對應(yīng)TestSuite類
測試執(zhí)行器(test runner)
對應(yīng)TextTestRunner類
4???IDE工具
既然需要開發(fā)代碼的生產(chǎn)力,那么就需要介紹一款I(lǐng)DE工具--?Pycharm。不可否認(rèn),它是目前最專注/專業(yè)的?Python?語言的?IDE?了。在對Pyunit?也有比較好的支持。
主要支持如下:
可視化的編程開發(fā)(這是IDE的基本特點)
對測試結(jié)果進(jìn)行可視化的展示
導(dǎo)出生成HTML的測試報告
可視化控制用例執(zhí)行(這個在開發(fā)調(diào)試階段很方便,可以方便控制指定代碼單元運行)
讓一個目錄下的所有用命執(zhí)行
讓單個文件內(nèi)所有用例執(zhí)行
讓單個文件內(nèi)的單個用命執(zhí)行
4.1???運行和調(diào)試
Pycharm?對測試腳本提供了靈活的運行和調(diào)試支持。
通過pycharm,開發(fā)人員可以不用編寫main函數(shù),就可以實現(xiàn)如下功能:
運行一個文件下所有的測試類
運行一個測試類的所有測試腳本
運行一個測試類的某個測試腳本
其中 "運行一個測試類的某個測試腳本" 比較有用,適合在開發(fā)階段快速地對單個腳本進(jìn)行開發(fā)和運行調(diào)試。
使用方法:
將光標(biāo)移動到測試函數(shù)內(nèi)部
按下運行快捷鍵 ctrl+shift+F10 (Eclipse快捷鍵方案)
如果要斷點調(diào)試,則使用Debug模式,即可對單個函數(shù)運行和斷點調(diào)試了。
當(dāng)然,也可以不必借用IDE,而通過對testSuit操作,也可以實現(xiàn)以上功能,但是IDE卻提供了更靈活直接的選擇。這只是一些IDE使用技巧,也不多述了。
4.2???結(jié)果可視化
對于前面提到的例子,如果選擇在IDE中運行此程序,會看到如下效果:
可以看到全部運行通過。如果刻意將其中一個弄成不通過的,則會顯示如下的結(jié)果:
最后感謝每一個認(rèn)真閱讀我文章的人,禮尚往來總是要有的,這些資料,對于【軟件測試】的朋友來說應(yīng)該是最全面最完整的備戰(zhàn)倉庫,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:
這些資料,對于【軟件測試】的朋友來說應(yīng)該是最全面最完整的備戰(zhàn)倉庫,這個倉庫也陪伴上萬個測試工程師們走過最艱難的路程,希望也能幫助到你!?文章來源:http://www.zghlxwxcb.cn/news/detail-834681.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-834681.html
到了這里,關(guān)于python自動化測試- 自動化框架及工具的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!