在学习ui自动化测试
的时候看一下面这些文章, 遇到一个很有意思的python关键字
@classmethod和类属性这块. 当时比较迷惑和自己没有整体看完整,所以一直不明白为啥多个设备的并行driver不冲突.然后就学习了一下相关的知识.
这个属性是归类所有,可以直接通过class.xxx
直接访问或修改, 这几个分享的driver都是通过这种方式保存和使用的. 如果想深入了解可以看这里关于 Python 类属性与实例属性的讨论
测试代码如下:
class BasePage(object):
num = -1
@classmethod
def change_num(cls, num):
cls.num = num
print("1: {}".format(BasePage.num))
BasePage.change_num(2)
print("2: {}".format(BasePage.num))
b = BasePage()
print("3: {}".format(b.num))
c = BasePage()
print("4: {}".format(c.num))
//output
1: -1
2: 2
3: 2
4: 2
这时候我们很清楚的看到这个属性是属于一个类的,为啥多设备的时候不冲突的,主要是以前一直使用java
,首先的概念就是多设备并行就是多线程,直到看到的下面的代码:
然后我们把上面的代码使用多进程的方式修改一下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from multiprocessing import Pool
class BasePage(object):
num = -1
@classmethod
def change_num(cls, num):
cls.num = num
@staticmethod
def _pool(run):
base_page = BasePage()
base_page.change_num(run)
print("num: {}".format(base_page.num))
print("num: {}".format(BasePage.num))
if __name__ == "__main__":
runs = [1, 2]
pool = Pool(processes=len(runs))
for run in runs:
pool.apply_async(BasePage._pool,
args=(run,))
print('Waiting for all runs done........ ')
pool.close()
pool.join()
print('All runs done........ ')
///output
Waiting for all runs done........
num: 1
num: 1
num: 2
num: 2
All runs done........
这时候发现上面的疑问莹然而解,然后这样也有一个好处,在任意的地方都可以直接获取driver
进行操作.