美文网首页python
Python 自动化测试框架unittest

Python 自动化测试框架unittest

作者: wayyyy | 来源:发表于2019-01-09 11:45 被阅读487次

最近工作中向同事学习了利用Python的unittest做自动化测试,另外简单查些资料做些补充。

测试的通用规则
  • 测试单元应该集中于小部分的功能,并且证明它是对的。
  • 每个测试单元应该完全独立,它们都能够单独运行,也可以在测试套件中运行,而不用考虑被调用的顺序。

unittest

unittest 是Python内置的单元测试测试框架,具备:

  1. 编写用例,即 test fixture
  2. 组织用例,即 test case,test suite
  3. 执行用例,即 test Loader
  4. 输出报告,即 test runner

等自动化测试框架必备条件。

  • test fixture
    一个测试用例的初始化准备及环境还原,主要是 setUp() 和 setDown() 方法。

  • test case
    一个完整的测试单元,执行该测试单元可以完成对某一个问题的验证。完整体现在:

    1. 测试前环境准备
    2. 执行测试代码
    3. 测试后环境还原
  • test suite
    多个测试用例的集合,测试套件或测试计划。

  • test Loader
    加载 TestCase 到 TestSuite 中的。

  • test runner
    执行测试用例,并将测试结果保存到TextTestResult实例中,包括运行了多少测试用例, 成功了多少,失败了多少等信息。


unittest的工作原理

// todo


unittest实战
  • 待测模块
    def is_prime(number):
        if number < 0 or number in (0, 1):
            return False;
        for element in range(2, number):
            if number % element == 0:
                return False;
        return True
    
    def add(a, b):
        return a + b;
    
    def divide(a, b):
        return a / b; 
    
  • 使用unittest编写测试用例
    import unittest
    class TestMyFunc(unittest.TestCase):
      def setup(self):
          print("每个用例执行前后会调用setUp方法准备环境")
      def tearDown(self):
          printf("每个用例执行前后会调用tearDown方法进行环境清理");
    
      def test_is_prime(self):
          '''test method is_prime'''
          self.assertEqual(is_prime(5))
          self.assertEqual(is_prime(0))
          self.assertEqual(is_prime(-1))
    
      def test_add(self)
          '''test method divide'''
          self.assertEqual(3, add(1, 2))
          self.assertEqual(3, add(2, 2))      
    
      def test_divide(self):
           '''test method divide''' 
           self.assertEqual(3, divide(6, 3))
           self.assertEqual(3, divide(5, 2))      
    
    if __name == '__main__':
        unittest.main()
    

框架解决自动化需求的4个问题
  • 如何控制用例执行顺序
    在unittest中,用例是以test开头的方法定义的,默认执行顺序是根据用例名称升序进行,为不是用例定义的先后顺序。在unittest中解决顺序的问题是使用TestSuite。代码如下:

    if __name__ == '__main__':
        tests = [TestMyFunc("test_is_prime"), TestMyFunc("test_add"), TestMyFunc("test_divide")]
    
        suite = unittest.TestSuite()
        suite.addTest(tests);
      
        runner = unittest.TextTestRunner()
        runner.run(suite)
    
  • 如何让多个用例共用setup,teardown
    unitest 的 setup,teardown 会在用例执行前后执行一次,如上面测试用例类中有3个测试用例,那么每个用例执行前后执行 setup,执行后会执行teardown,即 setup,teardown 总过调用三次。但考虑实际自动化测试场景,多个用例只需执行一次setup,全部用例执行完成后,执行一次teardown,针对该种场景,unittest的处理方法是使用setupclassteardownclass,注意如下:

    class TestMyFunc(unittest.TestCase):
        @classmethod
        def setUpClass(cls):
            print('所有用例执行前会调用一次setUp准备环境')
        @classmethod
        def tearDownClass(cls):
            print('所有用例执行后会调用一次tearDown进行环境清理')
        
        def test_is_prime(self):
            ''' test method divide'''
            self.assertEqual(2, divide(6, 3))
            slef.assertNotEqual(2, divide(5, 2))
    
    if __name__ == '__main__':
        unittest.main()
    
  • 如何跳过用例
    在自动化测试中,可能会用到选择性执行用例的情况,在unittest中解决的方法是使用skip装饰器,其中skip装饰器主要有3种:unittest.skip(reason)unittest.skipif(condition, reason)unittest.skipUnless(condition, reason),即在满足condition条件下跳过改用例,reason用于描述跳过的原因。

    ...
    @unittest.skipUnless(sys.platform.startwith('linux'), 'requires Linux')
    def test_devide(self):
        self.assertEqual(2, divide(6, 3))
        self.assertEqual(2, divide(5, 2))
           
    if __name__=='__main__':
        unittest.main()
    
  • 如何生成自动化测试报告
    unittest中模块生成的报告格式为txt,如果想生成html格式的报告,可以使用HtmlTestRunner模块,安装后导入该模块,使用HTMLTestRunner代替默认的TextTestRunner()执行测试用例即可。

    from HtmlTestRunner import HTMLTestRunner
    suite = unittest.TestSuite()
    suite.addTest(unittest.TestLoader().loadTestFromTestCase(TestMyfunc))
    sunner.run(suite)
    

参考资料

  1. https://www.jianshu.com/p/0b04cb0450ee
  2. https://www.jianshu.com/p/e0f74e54290d
  3. https://docs.python.org/3/library/unittest.html

相关文章

  • Unittest

    测试框架 基于 Python 语言的自动化测试框架 最知名的 有如下 3 款 测试框架:unittest,pyte...

  • 一篇文学会 Pytest 测试框架

    之前有介绍过python自带的Unittest单元测试框架,Python 自动化测试实战 Zero to Hero...

  • Pytest框架介绍、安装

    pytest是python测试框架,与python自带的unittest测试框架类似,但是比unittest框架使...

  • HttpRunner学习10--hook机制

    前言 对于使用过 Python结合Unittest 框架来做自动化测试的同学,应该知道在 Unittest 中,有...

  • Unittest二次开发实战-01-定制TestResult类

    前言 Unittest是Python自带的自动化测试框架,提供了基本的控制结构和模型概念。由于Unittest功能...

  • unittest-前后置和断言

    unittest框架是Python内置的单元测试框架,可以用来做单元测试,接口测试,UI自动化测试。 简单示例 针...

  • unittest断言测试方法

    前言 Python中unittest单元测试框架常用来编写自动化测试脚本。 Python中单元测试的断言方法主要如...

  • Selenium_unittest

    Selenium自动化测试-unittest单元测试框架使用 一、unittest unittest是一个单元测试...

  • 更强大的测试框架 Pytest

    不少同学做自动化测试时选择的是 Unittest 框架。Unittest 框架是 xunit 系列的测试框架 ,这...

  • python unittest使用基本过程

    前言 unittest是python的标准的单元测试框架,能够很好的和自动化测试相结合,并有独立的测试报告框架。 ...

网友评论

    本文标题:Python 自动化测试框架unittest

    本文链接:https://www.haomeiwen.com/subject/tusjhqtx.html