单元测试工具(连载13)

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

4.6 参数化


Pytest可以通过fixturesMark_Usefixtures和外部数据对测试用例进行参数化。

1. 通过fixtures参数化

案例15:通过fixtures参数化。
#利用fixtures的params
import pytest
from Calculator import calculator
from Util import util
@pytest.fixture(params=[{'first':20,"second":30,"result":50},{'first':20,"second":20,"result":40}])
defaccount_provider(request): #request是固定的。
    return request.param  #request.parm也是固定的。
def test_Calculato(account_provider):
   j=calculator(account_provider["first"],account_provider["second"])
    util.AssertEqual(j.myadd(),account_provider["result"])
if __name__ == '__main__':
   pytest.main(["-sv","Test_Parms_By_Pytest_Fixture.py"])


运行结果如下。

collected 2 items                                                             [0m
[32m[1m========================== 2 passed in 0.32 seconds===========================[0m
>>>


由于这里有两个参数,所以测试用例认为这里有两个测试用例。


通过Mark_Usefixtures参数化

案例16:通过Mark_Usefixtures参数化。
#利用Mark_Usefixtures的params
import pytest
from Calculator importcalculator
from Util import util
@pytest.fixture(params=[{'first':20,"second":30,"result":50},{'first':20,"second":20,"result":40}])
defaccount_provider(request): #request是固定的。
    return request.param  #request.parm也是固定的。
@pytest.mark.usefixtures("account_provider")
deftest_Calculato(account_provider):
   j=calculator(account_provider["first"],account_provider["second"])
   util.AssertEqual(j.myadd(),account_provider["result"])
if __name__ =='__main__':
   pytest.main(["-sv","Test_Parms_By_Mark_Usefixtures.py"])


注意:使用fixture标记函数后,函数将默认接入一个request参数,它将包含使用该fixture函数的信息,这使我们可以更加灵活的根据不同的函数来决定创建不同的对象以及释放函数。举例来说userfixtures可以用作setup()teardown()


3. 通过外部数据参数化

案例17:通过外部数据参数化。

Util.py读取本目录下名为data.xlsxExcel文件,文件格式如图36所示。


import xlrd
from xlutils.copy import copy
#读取Excel文件
def read_from_excel():
        fname = './data.xlsx’
        filename = xlrd.open_workbook(fname)
        sheets = filename.nsheets
        sheet1 = filename.sheets()[0]
        nrows1 = sheet1.nrows
        row_list = []
         fori in range(0,nrows1):
                row_datas = sheet1.row_values(i)
                row_list.append(row_datas)
        return row_list


测试程序。

import pytest
from Calculator import calculator
from Util import util
#直接写函数读取外部文件生成数据值,注意values返回值是个list
values = util.read_from_excel()
@pytest.mark.parametrize('v',values)
def test_login(v):
    print(values)
    print(v)
   j=calculator(v[0],v[1])
   util.AssertEqual(j.myadd(),v[2])
if __name__ == '__main__':
   pytest.main(["-sv","Test_Parms_By_Pytest_Mark_Parametrize.py"])


image.png

36  data.xlsx文件格式

运行结果为。


Test_Parms_By_Pytest_Mark_Parametrize.py::test_login[v0] [[100.0, 200.0, 300.0],[1.0, 5.0, 6.0]]
[100.0, 200.0, 300.0]
[32mPASSED[0m
Test_Parms_By_Pytest_Mark_Parametrize.py::test_login[v1] [[100.0, 200.0, 300.0],[1.0, 5.0, 6.0]]
[1.0, 5.0, 6.0]
[32mPASSED[0m
[32m[1m========================== 2 passed in 0.28seconds ===========================[0m


测试框架把Excel第一列赋值给v1、第二列赋值给v2,…


4.7 简易计算器测试用例用pytest最终实现方式


利用以上的各种方法,优化了最后简易计算器测试用例的最优化,代码如下。

案例18:用pytest实现简易计算器的测试的最终代码。
#coding=utf-8
import pytest
from Util import util
from Calculator import calculator
import allure
@pytest.fixture(params=[{'first':4,"second":2,"result":2},{'first':2,"second":4,"result":-2},{'first':4,"second":4,"result":0}])
def subs_provider(request):
    returnrequest.param
@pytest.fixture(params=[{'first':4,"second":2,"result":8},{'first':4,"second":-2,"result":-8},{'first':-4,"second":2,"result":-8},{'first':-4,"second":-2,"result":8}])
def multiply_provider(request):
    returnrequest.param
class TestCalculator:
    defsetup_class(self):
       print("测试开始")
   @allure.feature('test_module_Calculator')
   @allure.story('test_story_01')
   @allure.severity('blocker')
   @allure.issue("http://www.jila.com")
   @allure.testcase("http://www.testlink.com")
    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)
   @allure.feature('test_module_Calculator')
   @allure.story('test_story_01')
   @allure.severity('Normal')
   @allure.issue("http://www.jila.com")
   @allure.testcase("http://www.testlink.com")
    deftest_max_number(self):
       """

       用例描述:测试很大的数字

   

"""
       j=calculator(9223372036854775808,9223372036854775808)
       util.AssertEqual(j.mymultiply(),85070591730234615865843651857942052864)
   @allure.feature('test_module_Calculator')
   @allure.story('test_story_01')
   @allure.severity('Critical')
   @allure.issue("http://www.jila.com")
   @allure.testcase("http://www.testlink.com")
    deftest_subs(self,subs_provider):
       """

       用例描述:测试商为正数、负数和0

   

"""
       j=calculator(subs_provider["first"],subs_provider["second"])
        util.AssertEqual(j.mysubs(),subs_provider["result"])
   @allure.feature('test_module_Calculator')
   @allure.story('test_story_01')
   @allure.severity('Critical')
   @allure.issue("http://www.jila.com")
   @allure.testcase("http://www.testlink.com")
    def test_multiply(self,multiply_provider):
           """

           用例描述:测试正数乘正数、正数乘负数、负数乘正数和负数乘负数

     

"""
           j=calculator(multiply_provider["first"],multiply_provider["second"])
           util.AssertEqual(j.mymultiply(),multiply_provider["result"])

 

@allure.feature('test_module_Calculator')
   @allure.story('test_story_01')
   @allure.severity('Critical')
   @allure.issue("http://www.jila.com")
   @allure.testcase("http://www.testlink.com")
    deftest_divide(self):              
              """
               用例描述:除数为0
               """
              j=calculator(4,0)
              util.AssertEqual(j.mydivide(),0)
    defteardown_class(self):
       print("测试结束")
if __name__ == '__main__':
   pytest.main(['-sv', '-q', '--alluredir', './report/xml'])


 最后的测试报告如图37


image.png

37  简易计算器基于allure生成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在处理大规模并发测试中的潜力和优势。文章不仅提供了具体的操作步骤,还讨论了优化策略,帮助读者构建更加稳定和高效的自动化测试环境。