手續(xù)的關(guān)于測試的方法論,都是建立在之前的文章里面提到的觀點:
本系列選擇的測試語言是 python 腳本語言。由于其官方文檔已經(jīng)對原理有了比較清楚的解釋,本文就不做一些多余的翻譯工作了。偏向于實戰(zhàn)部分,而且為了偏向?qū)崙?zhàn),也會結(jié)合 IDE 工具和項目組織來進行講解。
理由如下:
1.腳本語言,開發(fā)和迭代的效率極高
2.第三方的擴展庫極多,有很我現(xiàn)成的工具可以使用
在正式進入到 自動化測試 的領(lǐng)域之前,先要建立這樣的價值觀。在Google內(nèi)部工程師發(fā)布的軟件測試的出版物里面提到:
“軟件的自動化測試是有成本的,而且成本不低,基本上相當于在原有的 功能開發(fā)工程 的基礎(chǔ)上再建立一個平行的 測試開發(fā)工程 ”。
也就是說,如果你對自動化測試有你的期望值,那么就肯定是要付出相應(yīng)的代價和精力的。好的東西也是需要優(yōu)秀的人花大量的時間去完成的。
使用 python 作為自動化編程語言,那么就自然的使用 pyunit 作為自動化測試框架了。
如下部分的內(nèi)容主要來自于 pyunit 的官方文檔,本文僅僅做了一些翻譯和結(jié)構(gòu)上的簡單調(diào)整。這部分屬于測試框架的基本原理和概念部分,在進行代碼編寫前,有必要進行了解。
python的單元測試框架 PyUnit,可以認為是 Java 語言下的單元測試框架 JUnit 的 Python 語言實現(xiàn)版本,甚至其作者之一 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.獨立測試函數(shù)
2.單用例測試類
3.多用例測試類
不同的編寫形態(tài),會有不同的組織方式,具體的可以看官方文檔。本文作者研究過官方文檔后,最喜歡第三種方式 多用例測試類,也就是上面基本示例的方式,這種方式具有如下特點:
在控制臺中運行此程序:
? 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ù)采用的最簡單的方式,直接運行所有的測試用例,并生成默認的文本報告。其實只需要對調(diào)用函數(shù)做一些簡單的修改,可以將這些測試用例進行合理組織,并獲取其實有用的數(shù)據(jù)信息,以便和信息系統(tǒng)進行集成,形成較好的擴展。
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é)果進行了統(tǒng)計,這些數(shù)據(jù)都是一次測試活動中的重要指標,這些數(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類,或者更細化的對應(yīng)里面的測試腳本函數(shù)
測試套件(test suite)
對應(yīng)TestSuite類
測試執(zhí)行器(test runner)
對應(yīng)TextTestRunner類
既然需要開發(fā)代碼的生產(chǎn)力,那么就需要介紹一款I(lǐng)DE工具-- Pycharm。不可否認,它是目前最專注/專業(yè)的 Python 語言的 IDE 了。在對Pyunit 也有比較好的支持。
主要支持如下:
可視化的編程開發(fā)(這是IDE的基本特點)
對測試結(jié)果進行可視化的展示
導(dǎo)出生成HTML的測試報告
可視化控制用例執(zhí)行(這個在開發(fā)調(diào)試階段很方便,可以方便控制指定代碼單元運行)
1.讓一個目錄下的所有用命執(zhí)行
2.讓單個文件內(nèi)所有用例執(zhí)行
3.讓單個文件內(nèi)的單個用命執(zhí)行
4.1 運行和調(diào)試
Pycharm 對測試腳本提供了靈活的運行和調(diào)試支持。
通過pycharm,開發(fā)人員可以不用編寫main函數(shù),就可以實現(xiàn)如下功能:
其中 “運行一個測試類的某個測試腳本” 比較有用,適合在開發(fā)階段快速地對單個腳本進行開發(fā)和運行調(diào)試。
使用方法:
1.將光標移動到測試函數(shù)內(nèi)部
2.按下運行快捷鍵 ctrl+shift+F10 (Eclipse快捷鍵方案)
如果要斷點調(diào)試,則使用Debug模式,即可對單個函數(shù)運行和斷點調(diào)試了。
當然,也可以不必借用IDE,而通過對testSuit操作,也可以實現(xiàn)以上功能,但是IDE卻提供了更靈活直接的選擇。這只是一些IDE使用技巧,也不多述了。
4.2 結(jié)果可視化
對于前面提到的例子,如果選擇在IDE中運行此程序,會看到如下效果:
一般情況下,做自動化測試和開發(fā),上面的那些那些技能已經(jīng)完全能夠滿足要求了,接下來要做的事情就是利用各種計算機基本知識,面對不斷增加的業(yè)務(wù)需求,而不斷地增加測試用例腳本了。
功能開發(fā)項目,原理都很簡單,但是隨著量的增加,都會形成規(guī)模,測試開發(fā)工程也是一樣。
之前對測試用例的 開發(fā)調(diào)試態(tài) 的工具進行了介紹。但是如果真正的要納入到 持續(xù)集成 的自動化體系,就顯然不能依賴于 IDE 了。而是使用python 語言的組織和調(diào)用方式了,比如:要有 main 函數(shù)來作為執(zhí)行入口,等等。
詳細的技術(shù)實現(xiàn)細節(jié),在后面有機會,將再會寫相應(yīng)的文章進行介紹。
通過脫離IDE的項目組織方式,有如下優(yōu)點:
關(guān)于如何自動化生成測試報告這個測試產(chǎn)物,現(xiàn)在有一些平臺能夠提供接口調(diào)用及報告展示和分享功能
上面是我收集的一些視頻資源,在這個過程中幫到了我很多。
當然還有面試,面試一般分為技術(shù)面和hr面,形式的話很少有群面,少部分企業(yè)可能會有一個交叉面,不過總的來說,技術(shù)面基本就是考察你的專業(yè)技術(shù)水平的,hr面的話主要是看這個人的綜合素質(zhì)以及家庭情況符不符合公司要求,一般來講,技術(shù)的話只要通過了技術(shù)面hr面基本上是沒有問題(也有少數(shù)企業(yè)hr面會刷很多人)
我們主要來說技術(shù)面,技術(shù)面的話主要是考察專業(yè)技術(shù)知識和水平,上面也是我整理好的精選面試題。
加油吧,測試人!如果你需要提升規(guī)劃,那就行動吧,在路上總比在起點觀望的要好。事必有法,然后有成。
聯(lián)系客服