单元测试工具(连载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小时。

目录
相关文章
|
21天前
|
测试技术 C语言
网站压力测试工具Siege图文详解
网站压力测试工具Siege图文详解
27 0
|
2月前
|
JavaScript jenkins 测试技术
这10款性能测试工具,收藏起来,测试人的工具箱!
这10款性能测试工具,收藏起来,测试人的工具箱!
|
2月前
|
人工智能 监控 测试技术
利用AI辅助工具提升软件测试效率
【2月更文挑战第17天】 随着科技的不断发展,人工智能(AI)在各个领域的应用越来越广泛。在软件测试领域,AI技术也发挥着重要作用。本文将探讨如何利用AI辅助工具提升软件测试效率,包括自动化测试、智能缺陷识别和预测等方面。通过引入AI技术,软件测试过程将变得更加高效、准确和可靠。
202 1
|
2月前
|
测试技术
现代软件测试中的自动化工具与挑战
传统软件测试面临着越来越复杂的系统架构和不断增长的测试需求,自动化测试工具应运而生。本文将探讨现代软件测试中自动化工具的应用和挑战,深入分析其优势与局限性,为软件测试领域的发展提供思路和启示。
|
2月前
|
测试技术 持续交付
现代软件测试中的自动化工具应用与挑战
随着信息技术的快速发展,软件行业对于质量和效率的要求日益提高,自动化测试工具在软件开发过程中扮演着至关重要的角色。本文将探讨现代软件测试中自动化工具的应用现状以及所面临的挑战,旨在帮助开发人员更好地理解并充分利用这一技术手段。
|
3天前
|
机器学习/深度学习 数据采集 人工智能
【专栏】利用AI辅助工具提高软件测试效率与准确性
【4月更文挑战第27天】本文探讨了AI在软件测试中的应用,如自动执行测试用例、识别缺陷和优化测试设计。AI辅助工具利用机器学习、自然语言处理和图像识别提高效率,但面临数据质量、模型解释性、维护更新及安全性挑战。未来,AI将更注重用户体验,提升透明度,并在保护隐私的同时,通过联邦学习等技术共享知识。AI在软件测试领域的前景广阔,但需解决现有挑战。
|
2月前
|
jenkins 测试技术 持续交付
现代软件测试中的自动化工具与挑战
随着软件开发领域的不断发展,自动化测试工具在测试过程中扮演着越来越重要的角色。本文将探讨现代软件测试中自动化工具的应用及面临的挑战,旨在帮助开发人员和测试人员更好地理解和应对自动化测试中的问题。
|
1天前
|
IDE 测试技术 持续交付
探索自动化测试工具Selenium的高效应用
【4月更文挑战第29天】 在快速迭代的软件开发过程中,高效的测试策略是确保产品质量的关键。本文将深入探讨如何利用自动化测试工具Selenium来提高软件测试的效率和准确性。通过介绍Selenium的核心功能、脚本编写技巧以及与持续集成环境的集成方法,我们旨在为读者提供一个全面的Selenium应用指南。此外,我们还将讨论常见的问题解决策略,并通过案例分析展示如何有效地运用Selenium进行复杂的Web应用测试。
|
2天前
|
Java 测试技术 数据库连接
软件测试中的自动化工具及其应用
传统的软件测试方法已经不能满足日益增长的软件开发需求,因此自动化测试工具应运而生。本文介绍了几种常用的自动化测试工具,并探讨了它们在软件测试中的应用及优势。
7 0
|
9天前
|
敏捷开发 Java 测试技术
探索自动化测试工具Selenium Grid的高效应用
【4月更文挑战第21天】 随着敏捷开发和持续集成的理念深入人心,自动化测试已成为软件开发过程中不可或缺的一环。本文将深入探讨如何利用Selenium Grid进行高效的自动化测试。通过分析其工作原理,搭建过程,以及在实际项目中的应用案例,揭示Selenium Grid在处理大规模并发测试中的潜力和优势。文章不仅提供了具体的操作步骤,还讨论了优化策略,帮助读者构建更加稳定和高效的自动化测试环境。