單元測試工具(連載10)

  • 2019 年 12 月 12 日
  • 筆記

3.5 使用Python腳本發送測試報告

Python可以很方便地寫出發送郵件的代碼,這比JAVA更加方便。

案例7:利用python發送電子郵件。

#!/usr/bin/env python

#coding:utf-8

import smtplib

from email.mime.text import MIMEText

from email.mime.multipart import MIMEMultipart

#發送郵箱服務器

smtpserver = 'smtp.126.com'

#發送郵箱

sender = '[email protected]'

#接受郵箱

receiver = 'tomtang @126.com'

#發送郵箱用戶名、密碼

username = '[email protected]'

password = '123456'

#郵件主題

subject = 'Python send email'

#發送的附件,即測試報告

sendfile = open('result.html','rb').read()

att = MIMEText(sendfile,'base64','utf-8')

att["content-Type"] ='application/octest-stream'

att["content-Disposition"] = 'attachment;filename="result.html"'

msgRoot = MIMEMultipart('related')

msgRoot['Subject'] = subject

msgRoot.attach(att)

smtp = smtplib.SMTP()

smtp.connect(smtpserver)

smtp.login(username,password)

smtp.sendmail(sender,receiver,msgRoot.as_string())

smtp.quit()

由此可見,使用Python腳本書寫的郵件發送代碼比JAVA要簡單得多,這樣可以通過Jenkins工具在無人值守的情況下可以將測試完畢後產生的測試報告自動發給相關人員。

4 Python單元測試框架pytest

4.1 pytest概述

pytest是python測試框架,與Python自帶的unittest測試框架類似,但是比unittest框架使用起來更簡潔,功能更強大。

pytest特徵如下。

l斷言提示信息更清楚。

l自動化加載函數與模塊。

l支持運行由nose、unittest編寫的測試case。

l支持Python3、Python7以及Python3.X。

l豐富的插件以及社區支持。

l支持參數化。

l支持失敗重跑。

l支持多線程運行測試用例。

l支持分佈式。

當然使用pytest之前需要通過pip在先安裝。

C:UsersJerry>pip install -U pytest

查看pytest版本如下。

C:UsersJerry>pytest –version

This is pytest version 4.0.2, imported fromc:python37libsite-packagespytest.py

下面是pytest測試上一節提到的測試建議計算器的代碼。

案例8:用pytest框架實現測試簡易計算器。

#coding=utf-8

import pytest

from Util import util

from Calculator import calculator

from parameterized import parameterized

class TestCalculator:

defsetup_class(self):

print("測試開始")

deftest_base(self):

j=calculator(4,2)

util.AssertEqual(j.myadd(),6)

util.AssertEqual(j.mysubs(),2)

util.AssertEqual(j.mymultiply(),8)

util.AssertEqual(j.mydivide(),2)

deftest_max_number(self):

j=calculator(9223372036854775808,9223372036854775808)

util.AssertEqual(j.mymultiply(),85070591730234615865843651857942052864)

deftest_subs(self):

mydata = [[4,2,2],[2,4,-2],[4,4,0]]

n=0

for i in mydata:

j=calculator(mydata[n][0],mydata[n][1])

util.AssertEqual(j.mysubs(),mydata[n][2])

n+=1

@parameterized.expand([

(4,2,2,),

(2,4,-2,),

(4,4,0,),

])

deftest_mysubs(self,a,b,p):

util.AssertEqual(calculator(a,b).mysubs(),p)

@pytest.mark.website

deftest_multiply(self):

mydata = [[4,2,8],[4,-2,-8],[-4,2,-8],[-4,-2,8]]

n=0

judge=True

for i in mydata:

j=calculator(mydata[n][0],mydata[n][1])

util.AssertEqual(j.mymultiply(),mydata[n][2])

n+=1

@parameterized.expand([

(4,2,8,),

(4,-2,-8,),

(-4,2,-8,),

(-4,-2,8,),

])

deftest_mymultiply(self,a,b,p):

util.AssertEqual(calculator(a,b).mymultiply(),p)

deftest_divide(self):

j=calculator(4,0)

util.AssertEqual(j.mydivide(),0)

defteardown_class(self):

print("測試結束")

if __name__ == '__main__':

pytest.main(["-s","test_Calculator.py"])

由於pytest沒有自己的斷言方法,所以只能用python自己的斷言。在這裡所有的斷言封裝在一個名為Util.py中。

#!/usr/bin/env python

#coding:utf-8

class util:

#判斷a是否等於b

defAssertEqual(a,b):

assert a == b

#判斷a是否不等於b

defAssertNotEqual(a,b):

assert a != b

#判斷a是否大於等於b

defAssertMoreEqual(a,b):

assert a >= b

#判斷a是否大於b

defAssertMore(a,b):

assert a > b

#判斷a是否小與等於b

defAssertLessEqual(a,b):

assert a <= b

#判斷a是否小於b

defAssertLess(a,b):

assert a < b

#判斷a是否在b中

defAssertIn(a,b):

assert a in b

#判斷a是否不在b中

defAssertNotIn(a,b):

assert a not in b

#判斷b是否為空

defAssertIsNone(b):

if (b):

assert 1==1

else:

assert 1==2

#判斷b是否不為空

defAssertIsNone(b):

if not (b):

assert 1==1

else:

assert 1==2

#用於判斷n是否為素數

defAssertPrime(n):

if n <= 1:

return False

for i in range(2, n):

if n % i == 0:

return False

return True

#用於判斷n是否不為素數

defAssertNoPrime(n):

return not AssertPrime(n)

另外可以看到parameterized同樣也可以在這裡使用。運行輸出結果如下。

=============== RESTART:C:pythonunittesttest_Calculator.py ===============

[1m============================= test sessionstarts =============================[0m

platform win32 — Python 3.7.1, pytest-4.0.2,py-1.7.0, pluggy-0.0

rootdir: C:pythonunittest, inifile:

[1mcollecting … [0m[1m

collected 12 items [0m

test_Calculator.py 測試開始

[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m除數不能為零

[32m.[0m測試結束

[32m[1m========================== 12 passed in 0.68seconds ==========================[0m

總結一下,pytest 必須遵循以下規則。

l如果你想用pytest尋找整個目錄下的測試用例,那麼文件須以test_開頭或者以test結尾。

l測試類以Test開頭,並且不能帶有init方法。

l測試函數以test開頭。

lpytest不支持也不打算支持中文路徑,如果項目路徑中有中文會報錯。

星雲測試

http://www.teststars.cc

奇林軟件

http://www.kylinpet.com

聯合通測

http://www.quicktesting.net