zoukankan      html  css  js  c++  java
  • 记录python接口自动化测试--unittest框架基本应用(第二目)

    在第一目里写了几个简单demo,并把调用get和post请求的方法封装到了一个类里,这次结合python自带的unittest框架,用之前封装的方法来写一个接口测试demo

    1.unittest简单用法

    # -*-coding:UTF:8-*-
    
    import unittest
    
    
    class TestMethod(unittest.TestCase):  # 定义一个类,继承自unittest.TestCase
        # 每次执行用例前执行setUp(),可以在这里做一些初始化的工作
        def setUp(self):
            print('setUp')
    
        # 每次执行用例后执行tearDown
        def tearDown(self):
            print('tearDown')
    
        def test001(self):  # unittest中的用例必须以test开头
            print('test001')
    
        def test002(self):
            print('test002')
    
    
    if __name__ == '__main__':
        unittest.main()

    运行结果如下:

     如果不想在每次执行用例时都执行一遍setUp()和tearDown(),只要执行一次就好,可以使用类方法代替:

    # -*-coding:UTF:8-*-
    
    import unittest
    
    
    class TestMethod(unittest.TestCase):  # 定义一个类,继承自unittest.TestCase
        # 每次执行用例前执行setUp(),可以在这里做一些初始化的工作
        @classmethod     
        def setUpClass(cls):
            print('setUp
    ')
    
        # 每次执行用例后执行tearDown
        @classmethod
        def tearDownClass(cls):
            print('tearDown')
    
        def test001(self):  # unittest中的用例必须以test开头
            print('test001')
    
        def test002(self):
            print('test002')
    
    
    if __name__ == '__main__':
        unittest.main()

    运行结果如下:

     2.接口测试实例

    # -*-coding:UTF:8-*-
    
    import unittest
    from interface.demo import RunMain   # 从之前封装的文件中,引入RunMain类
    import HTMLTestRunner
    import json
    
    
    class TestMethod(unittest.TestCase):    # 定义一个类,继承自unittest.TestCase
    
        def setUp(self):
            self.run = RunMain()   # 在初始化方法中实例化get/post基类,生成一个实例对象,这样就不需要在每个用例中再进行实例化了
    
        def test01(self):
            url = 'http://localhost:7001/XXX'
            data = {
                'controlSeq': '2018118325'
            }
            r = self.run.run_main(url, 'POST', data)   # 调用RunMain类中run_main方法
            print(r)
            re = json.loads(r)
            self.assertEqual(re['status'], '200', '测试失败')
    #注意我在进行断言前,先用json库的json.loads()函数对上一步中的返回结果r进行了解码,不然直接调用r['status']时会报错“json.loadsstring indices must be integers”
    #原因是,在之前的例子中,为了使显示效果更加直观,对服务器的响应结果利用json.dumps()进行了json格式的编码

    def test02(self): url = 'http://localhost:7001/XXX' data = { "controlSeq": "2018118325" } r = self.run.run_main(url, 'GET', data) print(r) re = json.loads(r) self.assertEqual(re["status"], '200', '测试失败') # @unittest.skip('test03') # 使用skip()方法表示跳过用例test03 def test03(self): url = 'http://localhost:7001/XXX' data = { 'controlSeq': '2018118361', 'seq': '2939', 'type': '1' } r = self.run.run_main(url, 'POST', data) print(r) # print(type(r)) # 查看返回对象r的类型 re = json.loads(r) # print(type(re)) self.assertEqual(re['status'], '200', '测试失败') if __name__ == "__main__": unittest.main() #表示执行全部用例

     3.使用TestSuite()来自定义执行case

    # -*-coding:UTF:8-*-
    
    import unittest
    from interface.demo import RunMain   # 从之前封装的文件中,引入RunMain类
    import HTMLTestRunner
    import json
    
    
    class TestMethod(unittest.TestCase):    # 定义一个类,继承自unittest.TestCase
    
        def setUp(self):
            self.run = RunMain()   # 在初始化方法中实例化get/post基类,生成一个实例对象,这样就不需要在每个用例中再进行实例化了
    
        def test01(self):
            url = 'http://localhost:7001/XXX'
            data = {
                'controlSeq': '2018118325'
            }
            r = self.run.run_main(url, 'POST', data)   # 调用RunMain类中run_main方法
            print(r)
            re = json.loads(r)
            self.assertEqual(re['status'], '200', '测试失败')
            # globals()['userid'] = 22   #定义全局变量
    
        def test02(self):
            # print(userid)   #使用case1中的全局变量,执行时需要全部执行,不能只执行后面的,不然会报错
            url = 'http://localhost:7001/XXX'
            data = {
                "controlSeq": "2018118325"
            }
            r = self.run.run_main(url, 'GET', data)
            print(r)
            re = json.loads(r)
            self.assertEqual(re["status"], '200', '测试失败')
    
        # @unittest.skip('test03')  # 跳过用例test03
        def test03(self):
            url = 'http://localhost:7001/XXX'
            data = {
                'controlSeq': '2018118361',
                'seq': '2939',
                'type': '1'
            }
            r = self.run.run_main(url, 'POST', data)
            print(r)
            # print(type(r)) # 查看返回对象r的类型
            re = json.loads(r)
            # print(type(re))  #查看json对象解码后的类型
            self.assertEqual(re['status'], '200', '测试失败')
    
    
    if __name__ == "__main__":    
    suite = unittest.TestSuite() # 调用unittest的TestSuite(),理解为管理case的一个容器(测试套件) suite.addTest(TestMethod('test01')) # 向测试套件中添加用例,"TestMethod"是上面定义的类名,"test01"是用例名,一条条地添加 suite.addTest(TestMethod('test02')) suite.addTest(TestMethod('test03'))

        # test_cases = [Update("test_case_001"), Update("test_case_002"), Update("test_case_003"), Update("test_case_004"),
    # Update("test_case_005"), Update("test_case_006"), Update("test_case_007"), Update("test_case_008")]
    # suite.addTests(test_cases) # 批量添加测试用例
        runner = unittest.TextTestRunner()  
    runner.run(suite)
    # 执行套件中的用例
    此时再执行这个文件,就只会执行添加到测试套件中的case了

    但是如果是使用的pycharm来运行脚本,则有几点需要注意,pycharm这里有个坑,困扰了我很久,在第三目中的小总结中说一下
  • 相关阅读:
    JavaScript的for循环编写九九乘法表
    Python核心编程(切片索引的更多内容)
    js/jq宽高的理解与运用
    七月与安生:不管选择哪条路,都会是辛苦的 — —豆瓣老丑
    Linux命令入门
    jq滚动监听-导航滚动
    jQuery页面滚动监听事件及高级效果插件
    跟随鼠标移动展示内容
    用相对定位和负向移动完成图片相框阴影
    腾讯数据总监:运营人员必须掌握的APP基础数据分析体系(没有比这篇更系统全面的)
  • 原文地址:https://www.cnblogs.com/hanmk/p/8652312.html
Copyright © 2011-2022 走看看