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格式的报告了,而且还自动把日期加上了
     

  • 相关阅读:
    QOMO Linux 4.0 正式版发布
    LinkChecker 8.1 发布,网页链接检查
    pgBadger 2.1 发布,PG 日志分析
    Aletheia 0.1.1 发布,HTTP 调试工具
    Teiid 8.2 Beta1 发布,数据虚拟化系统
    zLogFabric 2.2 发布,集中式日志存储系统
    开源电子工作套件 Arduino Start Kit 登场
    Piwik 1.9 发布,网站访问统计系统
    Ruby 1.9.3p286 发布,安全修复版本
    toBraille 1.1.2 发布,Java 盲文库
  • 原文地址:https://www.cnblogs.com/chendai21/p/8521856.html
Copyright © 2011-2022 走看看