ATX ATX UI 自动化学习-偏 python 语法知识

花开堪折枝 · October 22, 2019 · Last by simple replied at October 22, 2019 · 485 hits

在学习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进行操作.

看了一篇很好的文章也分享给大家:

共收到 1 条回复 时间 点赞

很棒的总结!

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up