Python可以很方便地写出发送邮件的代码,这比JAVA更加方便。
#!/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工具在无人值守的情况下可以将测试完毕后产生的测试报告自动发给相关人员。
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测试上一节提到的测试建议计算器的代码。
#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