前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >单元测试工具(连载10)

单元测试工具(连载10)

作者头像
顾翔
发布2019-12-12 13:42:01
5710
发布2019-12-12 13:42:01
举报

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 = 'tomtang@126.com'

#接受邮箱

receiver = 'tomtang @126.com'

#发送邮箱用户名、密码

username = 'tomtang@126.com'

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:\Users\Jerry>pip install -U pytest

查看pytest版本如下。

C:\Users\Jerry>pytest --version

This is pytest version 4.0.2, imported fromc:\python37\lib\site-packages\pytest.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:\python\unittest\test_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:\python\unittest, 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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 软件测试培训 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 3.5 使用Python脚本发送测试报告
  • 4 Python单元测试框架pytest
    • 4.1 pytest概述
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档