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)

 

 

 

  

posted @ 2020-01-13 15:33  蜗牛·哥  阅读(1122)  评论(0编辑  收藏  举报