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特征如下。
- 断言提示信息更清楚。
- 自动化加载函数与模块。
- 支持运行由nose、unittest编写的测试case。
- 支持Python3、Python7以及Python3.X。
- 丰富的插件以及社区支持。
- 支持参数化。
- 支持失败重跑。
- 支持多线程运行测试用例。
- 支持分布式。
当然使用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 必须遵循以下规则。
- 如果你想用pytest寻找整个目录下的测试用例,那么文件须以test_开头或者以test结尾。
- 测试类以Test开头,并且不能带有init方法。
- 测试函数以test开头。
- pytest不支持也不打算支持中文路径,如果项目路径中有中文会报错。
星云测试
奇林软件
联合通测
顾翔凡言:
k=(p+m)t
其中:
k为常数。
p:团队人员质量水平,为单位小时内产生的有效质量,单位为/h;
m:团队方法质量水平,为单位小时内产生的有效质量,单位为/h;
t:为单位质量产品的交付时间,单位为h。
在团队方法质量水平不变,团队人员质量水平提高的情况下,交付时间变短;
在团队人员质量水平不变,团队方法质量水平提高的情况下,交付时间变短;
团队人员质量水平与方法质量水平乘积决定了软件的质量水平,如果这个值变小,则t变大;反之t变小。
例如,当k=4时:
当人员质量水平为1/小时、方法水平为1/小时时,交付时间为2小时。
当人员质量水平为2/小时、方法水平为1/小时时,交付时间为4/3小时。
当人员质量水平为1/小时、方法水平为2/小时时,交付时间为4/3小时。
当人员质量水平为0.5/小时、方法水平为0.5/小时时,交付时间为4小时。