单元测试框架 Unittest使用

现在市面上大多采用Python+selenium+unittest进行web自动化测试,在前面的文章中主要讲解的是Python+selenium,下面我们引入unittest框架进行自动化测试脚本的组织管理。
引入unittest单元测试框架的好处有:
提供用例组织与执行
提供丰富的断言方法
提供丰富的日志和报告(HTML格式的更好一些)
一、单元测试框架的原理
TestCase:在unittest中的一个TestCase的实例就是一个测试用例,就是一个完整的测试流程,包括测试前资源初始化(setUp),执行测试代码(test),测试后环境的还原tearDown)。
TestSuite:测试套件,可以理解为:多个独立的测试用例(test case)可以构成一个测试套件,然后传递给TestRunner进行测试执行。
TestLoader:通过unittest.TestLoader类的loadTestsFromTestCase、loadTestsFromModule、LoadTestsFromName、discover方法,可以将测试用例添加一个测试套件中。
TestRunner :可以理解为测试集的运行器,可以在其基础上扩展子类 TextTestRunner或者HTMLTestRunner,只不过生成的测试报告样式不同。
TestResult:测试结果类,用来处理测试用例或测试集执行过程中的所有信息并最终输出,比如代码错误、异常、断言失败、skip等等。
二、unittest的使用
以下面实现加减乘除运算的myMath类为被测代码,使用Unittest进行单元测试

class mymath():
    def jia(self,a,b):
        #如果a是一个字符串,b是一个整形数据,应该是按照字符串拼接运算
        if isinstance(a,str) and isinstance(b,int):
            b = str(b)
            return a+b
        else:
            return a+b

    def jian(self,a,b):
        return a-b

    def chengfa(self,a,b):
        return a*b

    def chufa(self,a,b):
        if b==0:
            return "error"
        else:
            return a/b

1、TestCase
setUp():主要是进行测试用例的资源初始化,测试用例的前提条件写在这
test_xxx():测试用例,要把测试用例的步骤写在这个方法中
tearDown():主要是进行测试用例的资源释放的

import unittest
import myMath
# 创建一个单元测试类
class unitMymath(unittest.TestCase):
    #方法名不能改,self参数不能少
    def setUp(self):
        print("我是setup方法")
        self.mm = myMath.mymath()

    #必须是test开头的方法,这二个就是测试用例
    def test_add_2(self):
        print("我是第二条测试用例")
        actualValue = self.mm.jia("abc","123")
        expectValue = "abc123"
        self.assertEqual(actualValue,expectValue,"预期结果和实际不相等")

    def test_chengfa_2(self):
        print("我是第三条测试用例")
        actualValue = self.mm.chengfa(12,2)
        expectValue = 24
        self.assertEqual(actualValue,expectValue,"预期结果和实际不相等")

    #必须是test开头的方法,这一个就是测试用例
    def test_add_1(self):
        print("我是第一条测试用例")
        actualValue = self.mm.jia(10,12)
        expectValue = 22
        self.assertEqual(actualValue,expectValue,"预期结果和实际不相等")


    #方法名不能改,self参数不能少
    def tearDown(self):
        print("我是teardown方法")
        #用这句话,注销对象,释放资源
        self.mm = None

if __name__=='__main__':
    unittest.main()

TestCase中还可以使用注解,为用例指定特定的含义:
@classmethod:标记该方法为类初始化方法setUpClass()、tearDownClass()
@unittest.skipif(conditition,reason):condititon为条件,当条件为true时则跳过测试
@unittest.skip(reason):无条件跳过测试,reason描述为什么跳过测试
@unittest.skipunless(condition,reason):condition为条件,与上面相反,当条件不是true时则跳过测试
@unittest.expectedFailure:标记该测试预期为失败 ,如果该测试方法运行失败,则该测试不算做失败
2、TestSuite
通过unittest.TestSuite()类直接构建,可以通过TestSuite实例的addTest、addTests方法为测试套件添加用例
单个用例的集合,可以表示为:case = mathDemo(“test_add_case_1”),可以像测试集合一样直接给runner去运行

if __name__=='__main__':
    suitt = unittest.TestSuite()
    #测试集合对象中有一个方法,addtest-->追加单个测试用例到测试集合
    #格式:类名(用例名)
    suitt.addTest(unitMymath("test_chengfa_2"))
    suitt.addTest(unitMymath("test_add_2"))
    suitt.addTest(unitMymath("test_add_1"))
    
    # 测试集合对象还有一个方法,addtests-->追加多个测试用例到测试集合
    suitt.addTests(map(unitMymath,["test_add_2","test_add_1"]))

3、 TestLoader
通过unittest.TestLoader类的loadTestsFromTestCase、loadTestsFromModule、loadTestsFromName、discover方法,可以将测试用例添加一个测试套件中。
在这里插入图片描述
4、 TestRunner
TextTestRunner 语法:TextTestRunner(stream, descriptions=None, verbosity=0)
Stream:运行测试用例之后的结果要保存的文本文件流对象
Descriptions:对生成报告的描述性文字
Verbosity:日志显示等级
verbosity =< 0时—静默模式,输出结果中不提示执行成功的用例数
verbosity = 1 时—默认模式,输出结果中仅仅以(.)的形式表示执行成功的用例数,成功几个就是几个点
verbosity >= 2 时—详细模式,可以输出每个用例执行的详细信息,特别是在用例较多的情况下,此设置会比较有用
5、 TestResult
测试集合执行完毕之后,会返回TestResult对象,可以通过__dict__获取其中的字典格式的执行结果数据。
failfast:值为True或False,当设置为True时,测试过程中遇到失败或者错误,则立即终止后续的测试
failures:失败,这里会列出使用断言方法失败的情况。
errors:错误,这里会列出程序出现的异常错误。
testsRun:已经运行的所有测试的数量。
skipped:列出跳过的测试方法及原因。
expectedFailures:列出预期失败的方法。
unexpectedSuccesses:列出标记为预期失败,但实际运行却又成功的方法。
二、Unittest中断言的使用
一个自动化测试用例,测试步骤、测试的断言缺一不可,unittest中提供的断言方法有:
assertEqual(a,b,msg=""):就是判断a和b是否相等,如果相等,则断言成功,如果不相等,会断言失败,并且输出msg消息
assertNotEqual(a,b,msg=""):就是判断a和b是否不相等
assertTrue(a):就是判断a是否为True这个bool值
assertFalse(a):就是判断a是否为False这个bool值
assertIs(a,b,msg=""):判断a和b的内存地址是否相等,如果相等则身份一致
assertIsNot(a,b,msg):判断a和b的内存地址是否不相等,如果相等,断言失败
assertIsNone(a):判断对象a是不是空指针(没有指向堆内存中空间),如果是则断言成功
assertIsNotNone(a):判断对象a是不是空指针,如果是,则断言失败
assertIn(a,b):判断a是不是b的成员,如果是则断言成功
assertNotIn((a,b):判断a是不是b的成员,如果不是则断言成功
assertIsInstance(a,b):判断a是b的一个实例对象
assertIsNotInstance(a,b):判断a不是b的一个实例对象
三、主测试执行文件
在测试用例、测试文件比较多的时候,使用统一的主测试执行文件进行测试用例的执行非常方便,这就需要结合discover方法和TextTestRunner进行。

import unittest
from HTMLTestRunner import HTMLTestRunner
import time
import os

discover = unittest.defaultTestLoader.discover(r"./20200408/",pattern="myMathTest*.py")

#使用runner运行器运行测试集
with open(r"./20200408/res.txt","w",encoding="utf-8") as f:
     runner = unittest.TextTestRunner(f,descriptions="用于测试math类的用例执行",verbosity=2)
     runner.run(discover)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值