Python单元测试

代码用例可以单独执行
一个模块用例可以批量执行
多个模块用例可以批量执行
  • 单元测试框架Unittest介绍 java junit框架

TestCase:
一个测试用例,或是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run)以及测试后环境的还原(tearDown)。
单元元测试(unittest)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。
TestSuite:
而多个测试用例TestCase集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。
TestLoader:
用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。
TextTestRunner:
是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。
测试的结果会保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。
整个流程:首先是要写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,
运行的结果保存在TextTestResult中,整个过程集成在unittest.main模块中。
  • unittest的简单介绍及使用

一个完整的测试脚本包含:

1.importunittest
2.定义一个继承自unittest.TestCase的测试用例类
3.定义setUp和tearDown,在每个测试用例前后做一些辅助工作。
4.定义测试用例【函数】,名字以test开头。
5.一个测试用例应该只测试一个方面,测试目的和测试内容应很明确。主要是调用assertEqual、assertRaises等断言方法判断程序执行结果和预期值是否相符。
6.调用unittest.main()启动测试
7.如果测试未通过,会输出相应的错误提示。如果测试全部通过则不显示任何东西,也可以添加-v参数显示详细信息。
# -*-coding: utf-8 -*-
import unittest
class PythonunitTest(unittest.TestCase):
    def setUp(self):
        print("---测试初始化工作---")

    def testF(self):
        i=1+1
        print(i)
    def tearDown(self):
        print("---测试扫尾工作----")
if __name__ == "__main__": 
    unittest.main()
  • 断言 【断定的言论】

# -*-coding: utf-8 -*-
import unittest
class PythonunitTest(unittest.TestCase):
    def setUp(self):
        print("---测试初始化工作---")

    def testF(self):
       self.assertEqual(5+5,10)    # 判断预期结果和实际结果是否相等
       self.assertTrue(1==1)    # 判断结果是否为True,如果为True就通过
       self.assertFalse(1==2)    # 判断结果是否为False,如果为Flase就通过
       self.assertIn('c',['a','b'])    # 通过.判断某个元素是否在列表中

    def tearDown(self):
        print("---测试扫尾工作----")
if __name__ == "__main__":
    unittest.main()
  • TestSuite

TestSuite:
而多个测试用例TestCase集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。
TestLoader:
用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。
TextTestRunner:
是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。
importunittest
class Test1(unittest.TestCase):
    def setUp(self):
        pass
    def tearDown(self):
        pass
    def test_one(self):
        print("test1中第一个测试案例-----")

    def test_two(self):
        print("test1中第二个测试案例----")

class Test2(unittest.TestCase):
    def setUp(self):
        pass
    def tearDown(self):
        pass
    def test_one(self):
        print("test2中第一个测试案例-----")
    def test_two(self):
        print("test2中第二个测试案例-----")
 
 
if__name__ == '__main__':
    suite = unittest.TestSuite()
    # tests =[Test1("test_one"), Test1("test_two"),Test2("test_one")]
    # suite.addTests(tests)
    suite.addTest(Test1('test_one'))
   runner = unittest.TextTestRunner(verbosity=2) 0 1 2 

    runner.run(suite)
 
fp =open("aaa.txt", 'r+')
runner = unittest.TextTestRunner(stream=fp,verbosity=2)

#3创建一个驱动对象    两个参数   1:文件     2:写入情况  verbosity  =  0,1,2    0和1指的是一般记录情况  2指的是详细记录情况.写到文件中
 
 
#如果想全部加载到testSuite中
#suite.addTest(unittest.TestLoader().loadTestsFromTestCase(PythonTest1))
#suite.addTest(unittest.TestLoader().loadTestsFromTestCase(PythonTest2))
  • 生成html报告

#1.获取一个测试套件对象
suite =unittest.TestSuite()
#2.套件对象中添加测试用例函数
tests =unittest.TestLoader().loadTestsFromTestCase(TestJSQ)
suite.addTests(tests)
#3.获取可以生成html报告的运行器对象
#stream=文件对象,verbosity=详细程度,title=标题,description=描述
f =open(file='reports/baogao.html',mode='wb')
runner =HTMLTestRunnerX.HTMLTestRunner(stream=f,verbosity=3,title='测试计算器',description='测试描述')
#4.运行生成报告
runner.run(suite)
  • SetUpTearDown执行顺序及次数

classTestJSQ(unittest.TestCase):
    def setUp(self):    # 初始化函数
        print('setUp初始化')
        self.jsq = JiSuanQi()
 
    def test_01_jian(self):
        print('测试01')
        result = self.jsq.jian(10,5)
 
    def test_02_jian(self):
        print('测试02')
        result = self.jsq.jian(10,5)
 
    def tearDown(self):    # 扫尾工作
        print('tearDown测试结束')
 
if__name__ == '__main__':
    unittest.main()
  • SetUpClassTearDownClass执行次数

class TestJSQ(unittest.TestCase):
    @classmethod
    def setUpClass(self):
        print('测试用例类开始了')
        self.jsq = JiSuanQi()
 
    def test_01_jian(self):
        print('测试01')
        result = self.jsq.jian(10,5)
 
    def test_02_jian(self):
        print('测试02')
        result = self.jsq.jian(10,5)
 
    @classmethod
    def tearDownClass(self):
        print('测试用例类结束')
 
if__name__ == '__main__':
    unittest.main()
  • 总结

  1. unittest是Python自带的单元测试框架,我们可以用其来作为我们自动化测试框架的用例组织执行框架。

  1. unittest的流程:写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由 TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中,我们通过命令行或者 unittest.main()执行时,main会调用TextTestRunner中的run来执行,或者我们可以直接通过 TextTestRunner来执行用例。

  1. 一个class继承unittest.TestCase即是一个TestCase,其中以 test 开头的方法在load时被加载为一个真正的TestCase。

  1. verbosity参数可以控制执行结果的输出,0 是简单报告、1 是一般报告、2 是详细报告。

  1. 可以通过addTest和addTests向suite中添加case或suite,可以用TestLoader的loadTestsFrom__()方法。

  1. 用 setUp()、tearDown()、setUpClass()以及 tearDownClass()可以在用例执行前布置环境,以及在用例执行后清理环境

  1. 我们可以通过skip,skipIf,skipUnless装饰器跳过某个case,或者用TestCase.skipTest方法。

参数中加stream,可以将报告输出到文件:可以用TextTestRunner输出txt报告,以及可以用HTMLTestRunnerX输出html报告。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值