自动化测试之单线程与多线程

1.单线程

在单线程时代,当处理器需要处理多个任务时,必须对这些任务安排执行顺序,并按这个顺序来执行任务。

from time import sleep,ctime

# 听音乐任务
def music():
    print("I was listening to music, %s" % ctime())
    sleep(2)

# 看电影任务
def movie():
    print("I was at the movie, %s" % ctime())
    sleep(3)

if __name__ == '__main__':
    music()
    movie()
    print("all end: ", ctime())

执行结果:
在这里插入图片描述
下面根据用户的需求来播放指定的歌曲和电影

from time import sleep,ctime

# 音乐播放器
def music(func, loop):
    for i in range(loop):
        print("I was listening to %s, %s" % (func, ctime()))
        sleep(2)

# 视频播放器
def movie(func, loop):
    for i in range(loop):
        print("I was at the %s, %s" % (func, ctime()))
        sleep(3)

if __name__ == '__main__':
    music('白鸽', 2)
    movie('肖申克的救赎', 3)
    print("all end:", ctime())

执行结果:
在这里插入图片描述

2.多线程

我们应该避免使用thread模块,原因是它不支持守护线程。当主线程退出时,所有子线程不管它们是否还在工作,都会被强行退出。threading模块支持守护线程。

2.1 threading模块

from time import sleep,ctime
import threading

# 音乐播放器
def music(func, loop):
    for i in range(loop):
        print("I was listensing to %s, %s" % (func, ctime()))
        sleep(2)

# 视频播放器
def movie(func, loop):
    for i in range(loop):
        print("I was at the %s, %s" % (func, ctime()))
        sleep(3)

# 创建线程数组
threads = []

# 创建线程t1, 并添加到线程数组
t1 = threading.Thread(target=music, args=('白鸽', 2))
threads.append(t1)
# 创建线程t2, 并添加到线程数组
t2 = threading.Thread(target=movie, args=('肖申克的救赎', 3))
threads.append(t2)

if __name__ == "__main__":
    # 启动线程
    for t in threads:
        t.start()
    # 守护线程
    for t in threads:
        t.join()
    print("all end: %s" % ctime())

执行结果:
在这里插入图片描述

2.2 优化线程的创建

从上面的例子中发现线程的创建是颇为麻烦的,每创建一个线程都需要创建一个t1(t2,t3,…),当创建的线程较多时这样极其不方便,下面来做一些改进

from time import sleep,ctime
import threading

# 创建超级播放器
def super_player(file_, time):
    for i in range(2):
        print("Start playing: %s, %s" % (file_, ctime()))
        sleep(time)

# 播放的文件和时长
lists = {
    
    '白鸽.mp3':2 ,'肖申克的救赎.mp4':5 ,'Can we kiss forever.mp3':3}

threads = []
files = range(len(lists))

# 创建线程
for file_, time in lists.items():
    t = threading.Thread(target=super_player, args=(file_,time))
    threads.append(t)

if __name__ == '__main__':
    # 启动线程
    for t in files:
        threads[t].start()
    # 守护线程
    for t in files:
        threads[t].join()
    print("end: %s" % ctime())

执行结果:
在这里插入图片描述
这里首先创建了一个super_player()函数用来接收播放文件和播放时长,然后创建了lists字典用于存放文件名和时长,通过for循环读取字典,将新创建的线程追加到threads数组中,最后循环启动线程数组中的线程。

2.3 multiprocessing模块

多进程multiprocessing模块的使用与多线程threading模块的用法类似。multiprocessing模块提供了本地和远程的并发性,有效的通过全局解释锁(Global Interceptor Lock,GIL)来使用进程(而不是线程)。由于全局解释锁的存在,在CPU密集型的程序当中,使用多线程并不能有效的利用多核CPU的优势,因为一个解释器在同一时刻只会有一个线程在执行,而multiprocessing模块可以充分利用硬件的多处理器来进行工作
将threading模块中的Thread方法替换为multiprocessing模块的Process就实现了多进程,注意是多进程!

from time import sleep,ctime
import multiprocessing

# 创建超级播放器
def super_player(file_, time):
    for i in range(2):
        print("Start playing: %s, %s" % (file_, ctime()))
        sleep(time)

# 播放的文件和时长
lists = {
    
    '白鸽.mp3':2 ,'肖申克的救赎.mp4':5 ,'Can we kiss forever.mp3':3}

threads = []
files = range(len(lists))

# 创建线程
for file_, time in lists.items():
    t = multiprocessing.Process(target=super_player, args=(file_,time))
    threads.append(t)

if __name__ == '__main__':
    # 启动线程
    for t in files:
        threads[t].start()
    # 守护线程
    for t in files:
        threads[t].join()
    print("end: %s" % ctime())

执行结果:
在这里插入图片描述
从执行结果来看,是看不出多进程multiprocessing与多线程threading之间的差异的。

3.应用于自动化测试

3.1多线程执行测试用例

from threading import Thread
from time import sleep,ctime
from selenium import webdriver

def test_baidu(browser, search):
    print("start:%s" % ctime())
    print("browser:%s" % browser)
    if browser == "chrome":
        driver = webdriver.Chrome()
    else:
        print("browser参数有误,只能为chrome")

    driver.get("http://www.baidu.com")
    driver.maximize_window()
    driver.find_element_by_id("kw").send_keys(search)
    driver.find_element_by_id("su").click()
    sleep(2)
    driver.quit()

if __name__ == "__main__":
    # 启动参数(指定浏览器和百度搜索内容)
    lists = {
    
    'chrome':'C#','chrome':'Python','chrome':'Java'}
    threads = []
    files = range(len(lists))

    # 创建线程
    for browser,search in lists.items():
        t = Thread(target=test_baidu, args=(browser,search))
        threads.append(t)

    # 启动线程
    for t in files:
        threads[t].start()
    for t in files:
        threads[t].join()
    print("end:%s" % ctime())

执行结果:
在这里插入图片描述

Guess you like

Origin blog.csdn.net/qq_43096786/article/details/118440029