zoukankan      html  css  js  c++  java
  • Python 单元测试

    一,单元测试

    单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。

    单元测试的加载:通过unittest.main()来启动单元测试的测试模块;添加到testsuite集合中再加载所有的被测试对象,而testsuit里存放的就是单元测试的用例。

    补充查看模块内容及使用方法 代码如下:

    import unittest
    import HTMLTestRunner
    from BeautifulReport import BeautifulReport
    memblist1 = dir(unittest) # 查看模块有哪些成员
    for memb in memblist1 : #查看具体成员的用法
    cur = getattr(unittest,memb)
    print(help(cur))

    memblist = dir(HTMLTestRunner) # 查看模块有哪些成员
    for memb in memblist : #查看具体成员的用法
    cur = getattr(HTMLTestRunner,memb)
    print(help(cur))

    TestCase 也就是测试用例

    TestSuite 多个测试用例集合在一起,就是TestSuite

    TestLoader是用来加载TestCase到TestSuite中的

    TestRunner是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息

    整个单元测试框架的逻辑分三步走:第一步testloader根据传入的参数获得相应的测试用例,即对应具体的测试方法,
    然后makesuite在把所有的测试用例组装成testsuite,最后把testsiute传给testrunner进行执行。
    而我们通常执行的unittest.main(),其实就是unittest.testprom方法,其执行的功能就是上面分析的三步,在第一步中其传入的参数是自身的模块__main__;
    在第二步中把自身模块中的所有测试类中的测试方法提取出来,并生成测试套件;最后再把测试套件传递给testrunner进行具体的测试。

    常用断言:

    assertEqual(a, b)     a == b
    assertNotEqual(a, b) a != b
    assertTrue(x) bool(x) is True
    assertFalse(x) bool(x) is False
    assertIsNone(x) x is None
    assertIsNotNone(x) x is not None
    assertIn(a, b) a in b
    assertNotIn(a, b) a not in b
    实例:
    import unittest
    def calc(x,y): #被测模块

    return x+y

    class TestCalc(unittest.TestCase):#单元测试模块
    def test_pass_case(self):
    '''这是通过的测试用例'''
    print('这个通过用例')
    res = calc(1,2)
    self.assertEqual(3,res)
    self.assertNotEqual(2,res)#返回的结果不一样
    def test_fail_case(self):
    '''这是失败的测试用例'''
    print('这个是失败的用例')
    res = calc(1, 2)
    self.assertEqual(5, res)
    if __name__ =='__main__':
    unittest.main() #他会帮你运行当前这个python里面所有的测试用例。
    注:以test开头的方法就是测试方法,不以test开头的方法不被认为是测试方法,测试的时候不会被执行。用例执行的顺序是按照字母排列的顺序来的
    输出结果::【F表示一个fail, F前的点表示一个通过,有E的话表示程序自身异常】

    F.
    ======================================================================
    FAIL: test_fail_case (__main__.TestCalc)
    这是失败的测试用例
    ----------------------------------------------------------------------
    Traceback (most recent call last):
    File "C:/Users/lidal/PycharmProjects/llq-code/day7/练习.py", line 16, in test_fail_case
    self.assertEqual(5, res)
    AssertionError: 5 != 3

    ----------------------------------------------------------------------
    Ran 2 tests in 0.000s

    FAILED (failures=1)

    二,setUp 与 tearDown

    setUp() 与 tearDown() 这两个方法会分别在每调用一个测试方法的前后分别被执行

    setUp()tearDown()方法有什么用呢?设想你的测试需要启动一个数据库,这时,就可以在setUp()方法中连接数据库,在tearDown()方法中关闭数据库,这样,不必在每个测试方法中重复相同的代码:

    class TestCalc(unittest.TestCase):#单元测试模块
    def test_pass_case(self):
    '''这是通过的测试用例'''
    print('这个通过用例')
    res = calc(1,2)
    self.assertEqual(3,res)
    self.assertNotEqual(2,res)#返回的结果不一样
    def test_fail_case(self):
    '''这是失败的测试用例'''
    print('这个是失败的用例')
    res = calc(1, 2)
    self.assertEqual(5, res)
    def test_a(self):
    print('hahahaha ')
    def setUp(self):
    print('setUp。。')
    # 每个用例运行之前都会执行它
    def tearDown(self):
    # 每个用用例运行完之后都会执行它
    print('tearDown。。')
    三,setUpClass 与 tearDownClass
    setUpClass() 与 tearDownClass()这两个方法会在所有的用例执行前后执行一次
    使用方法如下:
    @classmethod
    def setUpClass(cls):
    print('我是setupClass')

    @classmethod
    def tearDownClass(cls):
    print('我是tearDownClass')

    四,输出html 格式的测试报告
    a,需安装 HTMLTestRunner 模块 (需自己手动导入至 )
    import HTMLTestRunner 
    if __name__ =='__main__':
    suite = unittest.TestSuite()#定义一个测试套件
    # suite.addTest(TestCalc('test_pass_case'))
    # suite.addTest(TestCalc('test_a'))
    # suite.addTest(TestCalc('test_fail_case')) #单个添加用例的
    suite.addTests(unittest.makeSuite(TestCalc)) #这个类里面的所有测试用例
    f = open('report.html','wb')#打开一个测试报告的文件
    runner = HTMLTestRunner.HTMLTestRunner(stream=f,title='test_report',
    description='描述')
    runner.run(suite) #运行
    b,安装 BeautifulReport 模块 ,较HTMLTsetRunner 模块生成的测试报告更直观,漂亮(同样需要自己手动导入)
    from BeautifulReport import BeautifulReport
    if __name__ =='__main__':
    suite = unittest.TestSuite()#定义一个测试套件
    # suite.addTest(TestCalc('test_pass_case'))
    # suite.addTest(TestCalc('test_a'))
    # suite.addTest(TestCalc('test_fail_case')) #单个添加用例的
    suite.addTests(unittest.makeSuite(TestCalc)) #这个类里面的所有测试用例
    # f = open('report.html','wb')#打开一个测试报告的文件
    # runner = HTMLTestRunner.HTMLTestRunner(stream=f,title='test_report',
    # description='描述')
    # runner.run(suite) #运行
    result = BeautifulReport(suite)
    result.report(filename='testreport', description='描述', log_path='.')

    五,输出xml 格式的测试报告,供后续jenkins 使用
    pip install xmlrunner 命令安装 xmlrunner 模块
    import xmlrunner
    if __name__ =='__main__':
    suite = unittest.TestSuite()#定义一个测试套件
    # suite.addTest(TestCalc('test_pass_case'))
    # suite.addTest(TestCalc('test_a'))
    # suite.addTest(TestCalc('test_fail_case')) #单个添加用例的
    suite.addTests(unittest.makeSuite(TestCalc)) #这个类里面的所有测试用例
    runner = xmlrunner.XMLTestRunner(output='report') # 指定报告放的目录
    runner.run(suite)
    输出结果:可以看到在report目录下已经产生了xml格式的报告了,而且还自动把日期加上了
     

  • 相关阅读:
    BETA 版冲刺前准备
    alpha事后诸葛亮
    alpha冲刺10
    alpha冲刺9
    alpha冲刺8
    alpha冲刺7
    alpha冲刺6
    alpha冲刺5
    第十一次作业
    Alpha冲刺一 (10/10)
  • 原文地址:https://www.cnblogs.com/chendai21/p/8521856.html
Copyright © 2011-2022 走看看