我们都知道App测试里面的专项测试-Monkey(随机测试),但对于桌面应用,没有提供相关的随机测试工具,我们可以通过控制鼠标和键盘,进行随机操作,实现类似Monkey的功能。
但是,我觉得,随机的对桌面应用进行鼠标和键盘操作时,大多数操作都是无效的,比如在非控件的地方点击或者在非输入框的地方键盘输入都是无效的,我们想要的效果是,在能点击的地方点击,在能输入的地方输入,这样才能做到有效的随机测试,而不是傻傻的一顿乱点。
用户在使用应用时,多半是基于某种场景或者某个功能的,我们成称为业务场景,而测试做的就是对业务场景进行测试,产出物就是测试用例,我们一个自动化测试用例就是测试一个业务场景;
因此,如果能随机的执行测试用例,也就相当于实现了针对业务的Monkey测试。
在UI自动化测试中,我们通常会将自动化测试用例放在项目框架的cases下面,基于unittest框架编写自动化测试用例,没有py文件保存一个测试用例,执行这个py文件就相当于执行这条测试用例了。
因此,我们的实现思路就转换成了,随机去执行cases下面的py文件。
在项目中我们执行用例的py文件时,通常有两种方法:
(1)在终端使用python3执行
$:python3 test_music_001.py
(2)在终端使用unittest命令执行
$:python3 -m unittest discover -s cases/ -p "test_music_001"
两种方法都是可以的,但是由于cases目录下还有根据不同的应用存在不同的目录结构;
第一种方法需要切换到相应的目录下才能执行,执行一个且一次,不够优雅;
第二种方法就只需要在项目根目录下执行即可;
因此选择第二种执行方法。
执行的结果需要统一记录在一个文件里面
获取到cases目录下的所有用例,然后每次随机选择其他一个执行就可以了。
import os, sys, subprocess, random
setting_path = os.path.abspath("..")
sys.path.append(setting_path)
from setting.config import *
from setting.often_use_method import *
class StabilityTest():
‘‘‘
稳定性测试,随机选取一些核心的业务场景,进行重复测试
‘‘‘
def __report(self, text):
‘‘‘
在report/stability_test目录下生成稳定性测试的执行日志
‘‘‘
filename = REPORT_PATH + ‘/stability_test/stability_%s.log‘ % times
with open(filename, ‘a‘) as f:
f.write(text + ‘\n‘)
def __str_time(self):
‘‘‘
标记用例执行的时间
‘‘‘
return time.strftime("%Y_%m_%d %H:%M:%S")
def __start_path(self, branch, app):
‘‘‘根据APP选择对用路径下面的用例‘‘‘
case_path = os.path.join(CASES_PATH, ‘cases_{}‘.format(str(branch)))
if not app:
return case_path
elif app in [‘album‘, ‘draw‘, ‘file_manager‘, ‘image_viewer‘, ‘movie‘, ‘music‘, ‘screen_recorder‘]:
return os.path.join(case_path, ‘{}_cases‘.format(app))
elif app in [‘screen‘, ‘recorder‘]:
return os.path.join(case_path, ‘screen_recorder_cases/{}_cases‘.format(app))
else:
return os.path.join(case_path, ‘file_manager_cases/{}_cases‘.format(app))
def __random_filename(self, branch, app):
‘‘‘
随机获取目录下的用例文件
‘‘‘
testcase_filename_list = []
for root, dirs, files in os.walk(self.__start_path(branch, app)):
for file in files:
if file.startswith(‘test_‘) and file.endswith(‘.py‘):
testcase_filename_list.append(file)
testcase_filename_random = random.choice(testcase_filename_list)
return testcase_filename_random
def __exec_case(self, branch, testcase_filename, i):
‘‘‘
执行用例
‘‘‘
print(‘[ ############# Running tests..... | No:%d | %s ############# ]‘ % (i, testcase_filename))
doit = ‘python3 -m unittest discover -s cases/cases_%s/ -p "%s"‘ % (str(branch), testcase_filename)
res = cmd(doit)
text = res.split(‘ ‘)[-1]
self.__report(text + ‘ ‘ + self.__str_time())
def __new_log_folder(self):
subprocess.Popen(‘if test ! -d %s/stability_test/;then mkdir %s/stability_test;fi‘ % (REPORT_PATH, REPORT_PATH),
shell=True)
def crazy_doit(self, branch, exec_num, app=None):
‘‘‘
基于具体业务场景的稳定性测试,在所有用例里面随机执行
:param nuexec_numm:执行的次数
‘‘‘
self.__new_log_folder()
i = 1
while i <= exec_num:
# 切换到项目根目录
os.chdir(BASE_PATH)
# 执行用例
self.__exec_case(branch, self.__random_filename(branch, app), i)
# 每隔10条杀一次桌面的进程
if i % 10 == 0:
kill_process(‘dde-desktop‘)
os.popen(‘dde-desktop‘)
clean_environment()
kill_all_process()
i += 1
if __name__ == ‘__main__‘:
st = StabilityTest()
st.crazy_doit(branch=1031, exec_num=2, app=‘image_viewer‘)
branch:分支,cases下面分为1031和1040
exec_num:要执行的测试理论上无上限,一般周末两天,设置10000次差不多
app:要执行的应用名称,如果写,默认执行所有用例。
原文:https://www.cnblogs.com/mikigo/p/14277987.html