zoukankan      html  css  js  c++  java
  • Appium python unittest pageobject如何实现加载多个case

      学习了Appium python项目施展的课程小伙伴都会有一个疑问,说现在所有的case都是通过一个suite进行一个方法一个方法进行添加的,但是在实际过程中我们不希望这样,我们做出来的功能是这样:

    suite = unittest.TestSuite()
    suite.addTest(CaseTest("test_02",parame=i))
    unittest.TextTestRunner().run(suite)
    

      这个是我们现在做的现状,但是我们希望的是:

    discover = unittest.defaultTestLoader.discover(case_dir,pattern='test_*.py')
    unittest.TextTestRunner().run(discover)
    

      那我们如何才能够我们做出来的换成我们想要的呢?我这里告诉大家答案,你现在还不行!

      为什么这么说呢?首先我们需要知道一个前提,我们现在拿到的discover是什么?我们运行机制是什么?先看下面两个简单代码:

    #coding=utf-8
    import unittest
    
    
    class StudyTest(unittest.TestCase):
    
        def test_study01(self):
            print("studytest de 01")
        def test_study02(self):
            print("studytest de 02")
    

      

    #coding=utf-8
    import unittest
    class StudyTest01(unittest.TestCase):
        def test_study001(self):
            print("studytest01 de 001")
    
        def test_study002(self):
            print("studytest01 de 002")
    
    
    
    if __name__ == '__main__':
        test_dit = './'
        discovre = unittest.defaultTestLoader.discover(test_dit,pattern='study_*.py')
        print(discovre)
        runner = unittest.TextTestRunner()
        runner.run(discovre)
    

      上面两个代码我们简单的实现了discover的实现,这里我们是不是想要的就是这样呢?但是为什么说不行呢?至少你现在不行,首先看一下我们打印的discover是什么。

    <unittest.suite.TestSuite tests=[
    <unittest.suite.TestSuite tests=[]>,
    <unittest.suite.TestSuite tests=[]>,
    <unittest.suite.TestSuite tests=[]>,
    <unittest.suite.TestSuite tests=[
    <unittest.suite.TestSuite tests=[]>,
    <unittest.suite.TestSuite tests=[<case.study_test.StudyTest testMethod=test_study01>, <case.study_test.StudyTest testMethod=test_study02>]>]>,
    <unittest.suite.TestSuite tests=[
    <unittest.suite.TestSuite tests=[<case.study_test01.StudyTest01 testMethod=test_study001>, <case.study_test01.StudyTest01 testMethod=test_study002>]>]>,
    <unittest.suite.TestSuite tests=[]>,
    <unittest.suite.TestSuite tests=[]>,
    <unittest.suite.TestSuite tests=[]>,
    <unittest.suite.TestSuite tests=[]>]>

      通过上面的打印我相信大家能够看出来,我把格式整理之后我们所谓的discover其实就是我们所有的case的一个集合(这里这么说不恰当,但是更容易理解),这里面是我们的用例,这个时候我只要去运行我们的case就可以了。那么问题来了,我们需要传递参数如何传递?是不是发现这样我们没办法传递参数?然后小伙伴们通过前面的课程发现了这样一个方法,课程中的方法我们讲到了

    一个全局变量,但是这个我们需要一个方法一个方法添加,这不是我们的目的,所以我们可以通过查找在网上也能够找到方法,看一下代码:

    #-*- coding: utf-8 -*-

    #author: mushishi

    #Date:2018年8月26日

    import unittest  

    class ParametrizedTestCase(unittest.TestCase):  

        """ 

         继承之后,重写一下,把这个参数传递到unittest里面

        """  

        def __init__(self, methodName='runTest', param=None):  

            super(ParametrizedTestCase, self).__init__(methodName)  

            self.param = param  

        @staticmethod  

        def parametrize(testcase_klass, param=None):  

            testloader = unittest.TestLoader()  

            testnames = testloader.getTestCaseNames(testcase_klass)  

            suite = unittest.TestSuite()  

            for name in testnames:  

                suite.addTest(testcase_klass(name, param=param))  

            return suite  

      

    class TestOne(ParametrizedTestCase):  

        def test_first(self):  

            print ('param =', self.param) 

            self.assertEqual(1, 1)  

       

        def test_two(self):

            print ('param =', self.param)   

            self.assertEqual(2, 2)  

    if __name__ == '__main__':

        suite = unittest.TestSuite()  

        suite.addTest(ParametrizedTestCase.parametrize(TestOne, param=1))  

        suite.addTest(ParametrizedTestCase.parametrize(TestOne, param=2))  

        unittest.TextTestRunner(verbosity=2).run(suite)  

     通过上面这个方法是不是发现可以传递参数。但是可能很多小伙伴不知道什么意思,没事,我们仔细看一下代码的拆分,毕竟这个代码网上很多,但是很多小伙伴不知道为什么,而且很多小伙伴不知道这个怎么和我们的需求串联起来,也不知道和我们这个有什么关系,我们应该怎么处理。我们看下面:

        suite = unittest.TestSuite()  
        suite.addTest(ParametrizedTestCase.parametrize(TestOne, param=1))
    

     首先我们看我们的程序执行入口,在我们这个入口我们知道我们有了一个容器,这个时候需要往容器里面添加case,这个case的添加我们是有条件的,我们首先需要知道这个case在哪一个class里面,也就是说我们添加我们case的时候是把class和方法一起添加的,那这个和我们上面说的通过拿到py文件,然后想参数话有啥关系?首先需要提出一个疑问:

      1、我们前面的代码只是拿到了我们所有的case,并没有拿到我们的class name,系统只是通过py文件去拿里面case然后添加到一个集合里

      2、我们后面知道的目前改进unittest框架的知识是需要class name的 这个我们好像也没办法操作

    有这么两个疑问之后那么我们可以换一个思考方式,既然参数话目前掌握的知识我们只能够通过上面的参数话去操作,那么我们如何去更改自己的代码,然后又不要我们一个一个case的添加?

      其实通过上面的代码大家就已经发现了一个不一样的地方,我们这个不需要每个方法每个方法去添加,只需要有个class name 就行,那么我们这样能够把所有的case都运用到这个里面来吗?答案是肯定的。

    我们只需要通过一个简单的转换就可以了。

    仔细看上面的代码我们知道,参数话这个代码肯定是公共的,那我们就把这个抽出来作为一个公共的类:

    #-*- coding: utf-8 -*-
    
    #author: mushishi
    
    #Date:2018年8月26日
    
    import unittest  
    
    class ParametrizedTestCase(unittest.TestCase):  
    
        """ 
    
         继承之后,重写一下,把这个参数传递到unittest里面
    
        """  
    
        def __init__(self, methodName='runTest', param=None):  
    
            super(ParametrizedTestCase, self).__init__(methodName)  
    
            self.param = param  
    
        @staticmethod  
    
        def parametrize(testcase_klass, param=None):  
    
            testloader = unittest.TestLoader()  
    
            testnames = testloader.getTestCaseNames(testcase_klass)  
    
            suite = unittest.TestSuite()  
    
            for name in testnames:  
    
                suite.addTest(testcase_klass(name, param=param))  
    
            return suite
    #这个类我们单独抽离出来,我们就是用来把这个作为参数化的集中地
    

    看到这里明白了么?其实我们只是需要把这个抽离出来,然后我们的case就变成了这样:

    第一个case类:

    #-*- coding: utf-8 -*-
    #author: mushishi
    #Date:2018年8月26日
    from case.ParametrizedTestCase import ParametrizedTestCase
    class Test01(ParametrizedTestCase):
        def test_01_case(self):
            print("这个是test01case里面的参数",self.param)
        def test_02_case(self):
            print("这个是test01case里面的参数",self.param)
    

    第二个case类:

    #-*- coding: utf-8 -*-
    
    #author: mushishi
    
    #Date:2018年8月26日
    from case.ParametrizedTestCase import ParametrizedTestCase
    import unittest
    from case.pounittest_one import Test01
    class TestOne(ParametrizedTestCase):  
    
        def test_first(self):  
    
            print ('param =', self.param) 
    
            self.assertEqual(1, 1)  
    
       
    
        def test_two(self):
    
            print ('param =', self.param)   
    
            self.assertEqual(2, 2)  
    
    if __name__ == '__main__':
    
        suite = unittest.TestSuite()  
    
        suite.addTest(ParametrizedTestCase.parametrize(TestOne, param=1))  
    
        suite.addTest(ParametrizedTestCase.parametrize(TestOne, param=2))
        suite.addTest(ParametrizedTestCase.parametrize(Test01,param=3))
    
        unittest.TextTestRunner(verbosity=2).run(suite)  
    

     这里我引入了两个case类,但是只是添加了这样的方法,是不是解决了呢?其实这样的方法网上很多,但是很多都需要思考怎么做。或者换一个思维。

  • 相关阅读:
    迭代器接口
    实现Promise
    学学springboot吧!!!!
    了解一下连接池!!!!
    Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modules ???报错!!!
    requset和response的区别????
    百度也太神奇了吧
    这个svn啊,真的是有点看不懂
    BootStrap???确实厉害
    突然看到原来除了jar包还有war包啊?????
  • 原文地址:https://www.cnblogs.com/Mushishi_xu/p/9503078.html
Copyright © 2011-2022 走看看