• appium 多个测试用例<多个 **.py文件>,只执行一次app <Python 3.8.1>


    本文只启动一次app指的是有多个测试的.py文件这种情况

    如果是在测试类如LoginTest中,有多个测试方法,如: test_1, test_2,想保证在执行完test_1后,不重新启动app,接着执行test_2,则把初始化的方法setUp换为setUpClass。

    setUp是在每个test方法运行前执行,有多少个test方法,就执行多少次,setUpClass方法是在所有test方法运行前执行,只执行一次。

    问题描述:在test_case中,有多个测试的.py文件,每次执行完一个.py文件,就会重新启动一次app,于是就想,有没有什么办法只启动一次app

    解决方法:

      单例模式

        单例模式可以确保某个类只有一个实例存在。让所有的.py文件公用一个driver,就可以避免多次启动app。

        如下在Public.py文件中

    1      _instence = None
    2      _instence_lock = threading.Lock()
    3      def get_devices(self):
    4          with Readconf._instence_lock:
    5              #Readconf为当前的类名
    6              if not Readconf._instence:
    7                  # conn_app为初始化devices的方法,具体内容,在下方显示
    8                  Readconf._instence = Readconf().conn_app()
    9          return Readconf._instence

    上述代码写完后,具体调用方式如下:

     1     @classmethod
     2     def setUpClass(cls):
     3         # Readconf类为get_devices方法所在的类
     4         cls.devices = Readconf().get_devices()
     5 
     6     # 然后正常调用 devices就可以了
     7     def test_a(self):
     8         self.devices.implicitly_wait(30)
     9         self.devices.find_element_by_id('******').click()
    10         self.devices.find_element_by_id('******').click()

    初始话devices的方法内容如下< conn_app() >:

     1     def conn_app(self):
     2         desired_caps = {
     3             "deviceName": self.conn('deviceName'),
     4             "platformName": self.conn('platformName'),
     5             "skipServerInstallation": self.conn('skipServerInstallation'),
     6             "skipDeviceInitialization": self.conn('skipDeviceInitialization'),
     7             # "noReset": self.conn('noReset'),
     8             "automationName": self.conn('automationName'),
     9             "appPackage": self.conn('appPackage'),
    10             "appActivity": self.conn('appActivity'),
    11             # "appWaitActivity":self.conn('appWaitActivity'),
    12             "udid": self.conn('udid'),
    13             "resetKeyboard": self.conn('resetKeyboard')
    14             }
    15         self.driver = webdriver.Remote(self.conn('url'), desired_caps)
    16         return self.driver

     当运行run.py报错时:

      错误如下:_TestResult' object has no attribute 'outputBuffer

        解决方式:

          1、在HTMLTestRunner.py中

              Ctrl+F搜索_TestResult方法,在__init__方法中添加:

            self.outputBuffer = io.StringIO()
            self.test_start_time = round(time.time(), 2)

            

     1     def __init__(self, verbosity=1):
     2         TestResult.__init__(self)
     3         self.stdout0 = None
     4         self.stderr0 = None
     5         self.success_count = 0
     6         self.failure_count = 0
     7         self.error_count = 0
     8         self.verbosity = verbosity
     9 
    10         # result is a list of result in 4 tuple
    11         # (
    12         #   result code (0: success; 1: fail; 2: error),
    13         #   TestCase object,
    14         #   Test output (byte string),
    15         #   stack trace,
    16         # )
    17         self.result = []
    18         self.subtestlist = []
    19 
    20        # 添加到这里
    21         self.outputBuffer = io.StringIO()
    22         self.test_start_time = round(time.time(), 2)

      

  • 相关阅读:
    http请求的GET和POST请求:查询和新增(server.php)
    http请求的GET和POST请求:查询和新增(ajax)
    shell中$(( )) 与 $( ) 还有${ }的区别
    linux查看操作系统版本信息
    Linux useradd 与 adduser的区别, /sbin/nologin 与 /bin/bash
    红帽触摸屏屏幕180旋转
    Sed命令n,N,d,D,p,P,h,H,g,G,x解析3
    sed命令
    sed高级用法:模式空间(pattern space)和保持空间(hold space)
    sed的模式空间和保持空间
  • 原文地址:https://www.cnblogs.com/guanyf/p/12187540.html
Copyright © 2020-2023  润新知