单元测试工具(连载10)

简介: 单元测试工具(连载10)

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概述

pytestpython测试框架,与Python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,功能更强大。

pytest特征如下。

  • 断言提示信息更清楚。
  • 自动化加载函数与模块。
  • 支持运行由noseunittest编写的测试case
  • 支持Python3Python7以及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不支持也不打算支持中文路径,如果项目路径中有中文会报错。


星云测试

http://www.teststars.cc

奇林软件

http://www.kylinpet.com

联合通测

http://www.quicktesting.net


顾翔凡言:

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小时。

目录
相关文章
|
1月前
|
Java 测试技术 数据安全/隐私保护
软件测试中的自动化策略与工具应用
在软件开发的快速迭代中,自动化测试以其高效、稳定的特点成为了质量保证的重要手段。本文将深入探讨自动化测试的核心概念、常见工具的应用,以及如何设计有效的自动化测试策略,旨在为读者提供一套完整的自动化测试解决方案,帮助团队提升测试效率和软件质量。
|
1月前
|
Web App开发 IDE 测试技术
Selenium:强大的 Web 自动化测试工具
Selenium 是一款强大的 Web 自动化测试工具,包括 Selenium IDE、WebDriver 和 Grid 三大组件,支持多种编程语言和跨平台操作。它能有效提高测试效率,解决跨浏览器兼容性问题,进行性能测试和数据驱动测试,尽管存在学习曲线较陡、不稳定等缺点,但其优势明显,是自动化测试领域的首选工具。
180 17
Selenium:强大的 Web 自动化测试工具
|
2月前
|
机器学习/深度学习 人工智能 算法
BALROG:基准测试工具,用于评估 LLMs 和 VLMs 在复杂动态环境中的推理能力
BALROG 是一款用于评估大型语言模型(LLMs)和视觉语言模型(VLMs)在复杂动态环境中推理能力的基准测试工具。它通过一系列挑战性的游戏环境,如 NetHack,测试模型的规划、空间推理和探索能力。BALROG 提供了一个开放且细粒度的评估框架,推动了自主代理研究的进展。
48 3
BALROG:基准测试工具,用于评估 LLMs 和 VLMs 在复杂动态环境中的推理能力
|
2月前
|
监控 测试技术 开发工具
移动端性能测试工具
移动端性能测试工具
61 2
|
2月前
|
安全 前端开发 测试技术
如何选择合适的自动化安全测试工具
选择合适的自动化安全测试工具需考虑多个因素,包括项目需求、测试目标、系统类型和技术栈,工具的功能特性、市场评价、成本和许可,以及集成性、误报率、社区支持、易用性和安全性。综合评估这些因素,可确保所选工具满足项目需求和团队能力。
|
2月前
|
安全 网络协议 关系型数据库
最好用的17个渗透测试工具
渗透测试是安全人员为防止恶意黑客利用系统漏洞而进行的操作。本文介绍了17款业内常用的渗透测试工具,涵盖网络发现、无线评估、Web应用测试、SQL注入等多个领域,包括Nmap、Aircrack-ng、Burp Suite、OWASP ZAP等,既有免费开源工具,也有付费专业软件,适用于不同需求的安全专家。
260 2
|
2月前
|
监控 网络协议 Java
一些适合性能测试脚本编写和维护的工具
一些适合性能测试脚本编写和维护的工具
|
2月前
|
Web App开发 定位技术 iOS开发
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
133 1
|
3月前
|
Java 流计算
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
56 1
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
|
3月前
|
jenkins 测试技术 持续交付
提升软件测试效率的实用技巧与工具
【10月更文挑战第12天】 本文将深入探讨如何通过优化测试流程、引入自动化工具和持续集成等策略,来显著提高软件测试的效率。我们将分享一些实用的技巧和工具,帮助测试人员更高效地发现和定位问题,确保软件质量。
79 2