当前位置: 首页 > news >正文

仿QQMusic测试报告

一、项目背景

        这是基于QT开发的一款仿qq音乐的app,用户可以在这款软件上获取最新的音乐推荐,可以播放本地和自己喜欢的音乐,也可以听自己喜欢的电台,还可以搜索自己喜欢的音乐等,但目前搜索的后端功能和部分模块尚未开发。

二、 需求分析与目标制定

        1.确定测试目标模块:例如音乐播放控制 (播放/暂停/切歌)、搜索功能 、歌单管理  等核心功能。

        2.目标制定:对QQ音乐实现回归测试,验证核心功能稳定性、界面交互响应等。

三、测试用例设计

四、设计自动化测试项目的架构

  1. 语言选择:python
  2. 技术栈:pytest 框架、pywinauto 模块、PyYAML 模块、pytest-order 模块、allure-pytest 模块、logging 模块。

     3.集成开发环境:pycharm

        

五、代码编写

(1) QQmusic 启动与关闭


import pytest
from pywinauto import Applicationfrom Untils.logUntil import Loggerclass QQmusicApp:def __init__(self):self.app_path=r"E:\QQmusic\QQmusic_player\QQmusic.exe"self.win=Noneself.app=Noneself.logger=Logger.getlog()#启动QQmusicdef launch(self):try:self.app=Application(backend="uia").start(self.app_path)#self.app = Application(backend="uia").connect(process=13604)self.win=self.app.window(title="QQmusic")self.win.wait("visible")self.logger.info("应⽤程序启动成功!")#self.win.print_control_identifiers()except Exception as e:self.logger.error(f"应⽤程序启动失败:{e}")#关闭QQmusicdef close(self):if self.win:self.win.close()@pytest.fixture(scope="session")
def QQMusic_app():QQmusic=QQmusicApp()QQmusic.launch()yield QQmusicQQmusic.close()


(2).封装log日志

import logging
import os.path
import time#两个文件级别的过滤
class InfoFilter(logging.Filter):def filter(self, record):return record.levelno == logging.INFO
class ErrFileter(logging.Filter):def filter(self, record):return record.levelno == logging.ERRORclass Logger:logger=None#每个类都会用到,改成类对象@classmethoddef getlog(cls):#创建日志对象if cls.logger is None:cls.logger=logging.getLogger(__name__)# #设置⽇志级别cls.logger.setLevel(logging.DEBUG)#设置写入日志的路径LOG_PATH = "logs/"#如果没有这个路径就创建一个if not os.path.exists(LOG_PATH):os.mkdir(LOG_PATH)# 2025-06-30.log  2025-06-30_err.log  2025-06-30_info.lognow = time.strftime("%Y-%m-%d")logname = LOG_PATH + now + ".log"info_logname = LOG_PATH + now + "_info.log"err_logname = LOG_PATH + now + "_err.log"#创建总⽇志⽂件处理器handler = logging.FileHandler(logname, encoding="utf-8")#创建info⽇志⽂件处理器info_handler = logging.FileHandler(info_logname, encoding="utf-8")#添加⽂件过滤info_handler.addFilter(InfoFilter())#创建err⽇志⽂件处理器err_handler = logging.FileHandler(err_logname, encoding="utf-8")err_handler.addFilter(ErrFileter())#设置⽇志格式formatter = logging.Formatter("%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d)] - %(message)s")handler.setFormatter(formatter)info_handler.setFormatter(formatter)err_handler.setFormatter(formatter)#给logger对象添加handlercls.logger.addHandler(handler)cls.logger.addHandler(info_handler)cls.logger.addHandler(err_handler)return cls.logger


(3).封装yaml

'''
yaml
相关的操作
'''
import os
import yamldef read_yaml(key):with open(os.getcwd() + "/data/elements.yml",mode="r",encoding="utf-8") as f:data = yaml.safe_load(f)return data[key]


(4).公共数据 yaml 文件

#根据元素进行实时的调整
logo:auto_id: QQmusic.background.head.headLeft.logocontrol_type: Text
search:auto_id: QQmusic.background.head.headRight.searchBox.lineEditcontrol_type: Edit
换肤:auto_id: QQmusic.background.head.headRight.settingBox.skincontrol_type: Button
最⼩化:auto_id: QQmusic.background.head.headRight.settingBox.mixcontrol_type: Button
导⼊⾳乐:auto_id: QQmusic.background.body.rightbody.controlBox.play2.addLoocalcontrol_type: Button
本地下载:auto_id: QQmusic.background.body.leftbody.leftbox.myMusic.localcontrol_type: Group播放全部:auto_id: QQmusic.background.body.rightbody.stackedWidget.localPage.musicPlayBox.playAll.playAllBtcontrol_type: Button本地音乐文本:auto_id: QQmusic.background.body.rightbody.stackedWidget.localPage.pageTittlecontrol_type: Text歌曲名称文本:auto_id: QQmusic.background.body.rightbody.stackedWidget.localPage.listLabelBox.musicNameLabelcontrol_type: Text歌手名称文本:auto_id: QQmusic.background.body.rightbody.stackedWidget.localPage.listLabelBox.musicSingerLabelcontrol_type: Text专辑名称文本:auto_id: QQmusic.background.body.rightbody.stackedWidget.localPage.listLabelBox.musicAlbumLabelcontrol_type: Text
播放控制:播放总进度:auto_id: QQmusic.background.body.rightbody.processBar.inLinecontrol_type: Custom当前播放进度:auto_id: QQmusic.background.body.rightbody.processBar.outLinecontrol_type: Custom歌曲名:auto_id: QQmusic.background.body.rightbody.controlBox.play1.musicSongcontrol_type: Text歌手名:auto_id: QQmusic.background.body.rightbody.controlBox.play1.musicSingercontrol_type: Text模式切换:auto_id: QQmusic.background.body.rightbody.controlBox.play2.playModecontrol_type: Button播放:auto_id: QQmusic.background.body.rightbody.controlBox.play2.playcontrol_type: Button
歌曲列表:auto_id: QQmusic.background.body.rightbody.stackedWidget.localPage.pageMusicListcontrol_type: List
推荐:auto_id: QQmusic.background.body.leftbody.leftbox.onlineMusic.Reccontrol_type: Group推荐文本:auto_id: QQmusic.background.body.rightbody.stackedWidget.recPage.scrollArea.qt_scrollarea_viewport.scrollAreaWidgetContents.recTextcontrol_type: Text今日为你推荐文本:auto_id: QQmusic.background.body.rightbody.stackedWidget.recPage.scrollArea.qt_scrollarea_viewport.scrollAreaWidgetContents.recMusicTextcontrol_type: Text你的音乐补给文本:auto_id: QQmusic.background.body.rightbody.stackedWidget.recPage.scrollArea.qt_scrollarea_viewport.scrollAreaWidgetContents.supplyTextcontrol_type: Text今日为你推荐左滚动:auto_id: QQmusic.background.body.rightbody.stackedWidget.recPage.scrollArea.qt_scrollarea_viewport.scrollAreaWidgetContents.recMusicBox.leftPagecontrol_type: Group今日为你推荐右滚动:auto_id: QQmusic.background.body.rightbody.stackedWidget.recPage.scrollArea.qt_scrollarea_viewport.scrollAreaWidgetContents.recMusicBox.rightPagecontrol_type: Group今日为你推荐第一项文本:auto_id: QQmusic.background.body.rightbody.stackedWidget.recPage.scrollArea.qt_scrollarea_viewport.scrollAreaWidgetContents.recMusicBox.musicContent.recListUp.recBoxItem.recBoxItemTextcontrol_type: Text音乐补给左滚动:auto_id: QQmusic.background.body.rightbody.stackedWidget.recPage.scrollArea.qt_scrollarea_viewport.scrollAreaWidgetContents.supplyBox.leftPagecontrol_type: Group音乐补给右滚动:auto_id: QQmusic.background.body.rightbody.stackedWidget.recPage.scrollArea.qt_scrollarea_viewport.scrollAreaWidgetContents.supplyBox.rightPagecontrol_type: Group音乐补给第一排第一项文本:auto_id: QQmusic.background.body.rightbody.stackedWidget.recPage.scrollArea.qt_scrollarea_viewport.scrollAreaWidgetContents.supplyBox.musicContent.recListUp.recBoxItem.recBoxItemTextcontrol_type: Text音乐补给第二排第一项文本:auto_id: QQmusic.background.body.rightbody.stackedWidget.recPage.scrollArea.qt_scrollarea_viewport.scrollAreaWidgetContents.supplyBox.musicContent.recListDown.recBoxItem.recBoxItemTextcontrol_type: Text推荐整个模块:auto_id: QQmusic.background.body.rightbody.stackedWidgetcontrol_type: Custom
我喜欢:auto_id: QQmusic.background.body.leftbody.leftbox.myMusic.like.btStylecontrol_type: Group我喜欢文本:auto_id: QQmusic.background.body.rightbody.stackedWidget.likePage.pageTittlecontrol_type: Text歌曲名称文本:auto_id: QQmusic.background.body.rightbody.stackedWidget.likePage.listLabelBox.musicNameLabelcontrol_type: Text歌手名称文本:auto_id: QQmusic.background.body.rightbody.stackedWidget.likePage.listLabelBox.musicSingerLabelcontrol_type: Text专辑名称文本:auto_id: QQmusic.background.body.rightbody.stackedWidget.likePage.listLabelBox.musicAlbumLabelcontrol_type: Text播放全部:auto_id: QQmusic.background.body.rightbody.stackedWidget.likePage.musicPlayBox.playAll.playAllBtcontrol_type: Button歌曲列表:auto_id: QQmusic.background.body.rightbody.stackedWidget.likePage.pageMusicListcontrol_type: List
歌词入口:auto_id: QQmusic.background.body.rightbody.controlBox.play3.lrcWordcontrol_type: Button歌手标题文本:auto_id: QQmusic.LrcPage.bgStyle.lrcTop.titleBox.musicSingercontrol_type: Text歌曲名标题文本:auto_id: QQmusic.LrcPage.bgStyle.lrcTop.titleBox.musicNamecontrol_type: Text收起歌词:auto_id: QQmusic.LrcPage.bgStyle.lrcTop.hideBtncontrol_type: Button歌词列表:auto_id: QQmusic.LrcPage.bgStyle.lrcContentcontrol_type: Group


(5).公共模块测试用例

import math
import time
import pytest
from pywinauto import mouse
from Untils.yamlUtils import read_yaml
from Untils.logUntil import Logger
@pytest.mark.order(1)
class TestCommon:logger = Logger.getlog()'''测试logo'''def test_logo(self, QQMusic_app):logo_ele = read_yaml("logo")logo = QQMusic_app.win.child_window(auto_id=logo_ele['auto_id'],control_type=logo_ele["control_type"])logo.wait("visible")'''测试 ——搜索功能    '''def test_search(self, QQMusic_app):edit_ele = read_yaml("search")edit = QQMusic_app.win.child_window(auto_id=edit_ele['auto_id'],control_type=edit_ele["control_type"])#唤起输⼊框edit.click_input()# ctrl+a全部选中之后再输⼊关键词,就不会存在追加的情况edit.type_keys("^a周星星")'''测试-换皮肤'''def test_skin(self, QQMusic_app):skin_ele = read_yaml("换肤")skin =QQMusic_app.win.child_window(auto_id=skin_ele['auto_id'], control_type=skin_ele['control_type'])#点击换肤⼊⼝,唤起弹窗skin.click_input()#验证弹窗以及⽂本信息warning = QQMusic_app.win.child_window(title="温馨提⽰",control_type = "Window")warning.wait("visible")warn_text = warning.child_window(control_type="Text").window_text()assert warn_text == "小撒正在加班紧急⽀持中..."#关闭温馨提⽰弹窗warning.close()time.sleep(0.5)#测试弹窗是否正确关闭warning.wait_not("visible")'''测试——最⼩化   '''def test_window_min(self, QQMusic_app):window_min_ele = read_yaml("最⼩化")window_min_btn =QQMusic_app.win.child_window(auto_id=window_min_ele['auto_id'],control_type=window_min_ele['control_type'])#点击最⼩化按犍window_min_btn.click_input()#测试⼀下QQ⾳乐窗⼝是否已经最⼩化了assert QQMusic_app.win.is_minimized()#还原QQMusic_app.win.restore()'''测试——导⼊⾳乐   '''def test_importMusic(self, QQMusic_app):import_ele = read_yaml("导⼊⾳乐")import_btn =QQMusic_app.win.child_window(auto_id=import_ele['auto_id'],control_type=import_ele['control_type'])#点击导⼊⾳乐按钮import_btn.click_input()#定位添加本地下载⾳乐窗⼝import_win = QQMusic_app.win.child_window(title="添加本地⾳乐",control_type="Window")import_win.wait("visible")#选中所有⾳乐并添加music_list = import_win.child_window(title="项目视图",control_type="List")#打开⾳乐:1)通过“打开”按钮来实现# 2)enter键实现music_list.type_keys("^a{ENTER}")import_win.wait_not("visible")'''播放控制模块 ——随机播放    默认模式就是随机播放    默认是暂停    '''def test_play_random(self, QQMusic_app):#点击播放全部local_ele = read_yaml("本地下载")play_all_ele = local_ele["播放全部"]play_btn =QQMusic_app.win.child_window(auto_id=play_all_ele['auto_id'],control_type=play_all_ele['control_type'])# 切换模式:随机播放——单曲循环play_ele = read_yaml("播放控制")playMode_ele = play_ele["模式切换"]playMode_btn = QQMusic_app.win.child_window(auto_id=playMode_ele['auto_id'],control_type=playMode_ele['control_type'])# 点击切换模式按钮playMode_btn.click_input()for i in range(1, 4):#点击播放全部,从第⼀⾸歌曲开始播放(2002年的第⼀场雪)play_btn.click_input()#将歌曲播放进度拉到尾部play_ele = read_yaml("播放控制")process_line_ele = play_ele["播放总进度"]process_line =QQMusic_app.win.child_window(auto_id=process_line_ele['auto_id'],control_type=process_line_ele['control_type'])#获取进度条的尺⼨rec = process_line.rectangle()x = rec.right - 3y = math.floor((rec.top + rec.bottom) / 2)#⿏标点击进度条的尾部mouse.click(coords=(x, y))#等待切换下⼀曲time.sleep(2)#检查下⼀是否为列表中第⼆⾸歌# 1)若是,随机播放模式不⼀定错误#  2)若不是,随机播放模式正确music_name_ele = play_ele["歌曲名"]music_name =QQMusic_app.win.child_window(auto_id=music_name_ele['auto_id'],control_type=music_name_ele['control_type']).window_text()if music_name != "Andy阿杜":self.logger.info(f"第{i}次判断随机播放下⼀曲正确")returnelse:self.logger.info(f"第{i}次判断随机播放下⼀曲错误")#⾛到这⾥还没有返回raise Exception("随机播放下⼀曲三次判断均错误")'''播放控制模块——单曲循环    默认模式就是随机播放--切换模式    上⼀个⽤例执⾏完是播放    '''def test_play_single(self, QQMusic_app):# 点击播放全部local_ele = read_yaml("本地下载")play_all_ele = local_ele["播放全部"]play_btn = QQMusic_app.win.child_window(auto_id=play_all_ele['auto_id'],control_type=play_all_ele['control_type'])#切换模式:随机播放——单曲循环play_ele = read_yaml("播放控制")playMode_ele = play_ele["模式切换"]playMode_btn =QQMusic_app.win.child_window(auto_id=playMode_ele['auto_id'],control_type=playMode_ele['control_type'])#点击切换模式按钮playMode_btn.click_input()for i in range(1, 4):#点击播放全部按钮play_btn.click_input()music_name_ele = play_ele["歌曲名"]music_name_before =QQMusic_app.win.child_window(auto_id=music_name_ele['auto_id'],control_type=music_name_ele['control_type']).window_text()# 将歌曲播放进度拉到尾部process_line_ele = play_ele["播放总进度"]process_line =QQMusic_app.win.child_window(auto_id=process_line_ele['auto_id'],control_type=process_line_ele['control_type'])# 获取进度条的尺⼨rec = process_line.rectangle()x = rec.right - 3y = math.floor((rec.top + rec.bottom) / 2)# ⿏标点击进度条的尾部mouse.click(coords=(x, y))# 等待切换下⼀曲time.sleep(2)#下⼀⾸播放的歌曲和前⼀⾸歌曲是否相同#1)相同,单曲循环模式不⼀定正确 - -多次验证#2)不相同,单曲循环模式错误music_name_after =QQMusic_app.win.child_window(auto_id=music_name_ele['auto_id'],control_type=music_name_ele['control_type']).window_text()if music_name_before != music_name_after:self.logger.error(f"单曲循环模式播放下⼀⾸歌曲校验错误,before:{music_name_before}, after: {music_name_after}")breakelse:self.logger.info(f"第{i}次校验单曲循环模式播放下⼀⾸歌曲正确")if i == 3:returnraise Exception(f"单曲循环模式播放下⼀⾸歌曲校验错误,before:{music_name_before}, after: {music_name_after}")'''播放控制模块——列表循环    默认模式就是单曲循环播放--切换模式    上⼀个⽤例执⾏完是播放   '''def test_play_circle(self, QQMusic_app):#切换模式:单曲循环——列表循环play_ele = read_yaml("播放控制")music_name_ele = play_ele["歌曲名"]playMode_ele = play_ele["模式切换"]playMode_btn = QQMusic_app.win.child_window(auto_id=playMode_ele['auto_id'],control_type=playMode_ele['control_type'])# 点击切换模式按钮playMode_btn.click_input()for i in range(1, 4):#找到列表中最后⼀⾸歌曲music_list_ele = read_yaml("歌曲列表")music_list =QQMusic_app.win.child_window(auto_id=music_list_ele['auto_id'],control_type=music_list_ele['control_type'])#获取歌曲列表的中间坐标list_mid = music_list.rectangle().mid_point()#⿏标下拉列表使其展⽰最后⼀⾸歌曲mouse.scroll(coords=(list_mid.x, list_mid.y), wheel_dist=-500)#获取最后⼀⾸歌曲——求列表中列表项⽬数list_size = music_list.item_count()#双击最后⼀⾸歌曲,使其播放last_music_mid = music_list.get_item(row=list_size-1).rectangle().mid_point()mouse.double_click(coords=(last_music_mid.x, last_music_mid.y))#拉取进度条到尾部,等待播放下⼀曲process_line_ele = play_ele["播放总进度"]process_line =QQMusic_app.win.child_window(auto_id=process_line_ele['auto_id'],control_type=process_line_ele['control_type'])# 获取进度条的尺⼨rec = process_line.rectangle()x = rec.right - 3y = math.floor((rec.top + rec.bottom) / 2)# ⿏标点击进度条的尾部mouse.click(coords=(x, y))# 等待切换下⼀曲time.sleep(2)# 校验播放的下⼀⾸歌曲是否为“2002年的第⼀场雪(列表的第⼀⾸歌曲)”#1)是,列表循环校验不⼀定正确#2)不是,列表循环校验错误music_name =QQMusic_app.win.child_window(auto_id=music_name_ele['auto_id'],control_type=music_name_ele['control_type']).window_text()if music_name != "2002年的第一场雪":self.logger.error(f"列表循环下⼀曲错误, music_name: {music_name}")breakelse:self.logger.info(f"第{i}次校验列表循环下⼀曲正确")if i == 3:returnraise Exception(f"列表循环下⼀曲错误, music_name: {music_name}")


(6).推荐模块测试用例

import pytest
from pywinauto import mousefrom Untils.logUntil import Logger
from Untils.yamlUtils import read_yaml@pytest.mark.order(2)
class TestRecommend:logger = Logger.getlog()'''测试——推荐页面的文本"推荐、今日为你推荐、你的音乐补给"'''def test_rec_text(self,QQMusic_app):#点击左侧的推荐导航入口,进入到推荐页面rec_ele = read_yaml("推荐")rec_btn = QQMusic_app.win.child_window(auto_id=rec_ele["auto_id"],control_type=rec_ele["control_type"])rec_btn.click_input()#获取“推荐”文本控件rec_text_ele = rec_ele["推荐文本"]#获取“今日为你推荐”文本控件rec_foru_text_ele = rec_ele["今日为你推荐文本"]#获取“你的音乐补给”文本控件rec_supply_text_ele = rec_ele["你的音乐补给文本"]#校验“推荐”文本控件rec_text =  QQMusic_app.win.child_window(auto_id=rec_text_ele["auto_id"],control_type=rec_text_ele["control_type"])assert rec_text.window_text() == "推荐"# 校验“今日为你推荐”文本控件rec_foru_text = QQMusic_app.win.child_window(auto_id=rec_foru_text_ele["auto_id"],control_type=rec_foru_text_ele["control_type"])assert rec_foru_text.window_text() == "今日歌曲推荐"#校验“你的音乐补给”文本控件rec_supply_text = QQMusic_app.win.child_window(auto_id=rec_supply_text_ele["auto_id"],control_type=rec_supply_text_ele["control_type"])assert rec_supply_text.window_text() == "你的音乐补给"'''测试今日为你推荐滚动区域——左滚动'''def test_recforu_scroll_left(self,QQMusic_app):rec_ele = read_yaml("推荐")item_text_ele = rec_ele["今日为你推荐第一项文本"]item_text_before = QQMusic_app.win.child_window(auto_id=item_text_ele["auto_id"],control_type=item_text_ele["control_type"],found_index=0).window_text()scroll_left_ele = rec_ele["今日为你推荐左滚动"]scroll_left = QQMusic_app.win.child_window(auto_id=scroll_left_ele["auto_id"],control_type=scroll_left_ele["control_type"])#点击左滚动按钮scroll_left.click_input()#获取推荐项的名称,进行前后对比校验item_text_after = QQMusic_app.win.child_window(auto_id=item_text_ele["auto_id"],control_type=item_text_ele["control_type"],found_index=0).window_text()assert item_text_before != item_text_after'''测试今日为你推荐滚动区域——右滚动'''def test_recforu_scroll_right(self, QQMusic_app):rec_ele = read_yaml("推荐")item_text_ele = rec_ele["今日为你推荐第一项文本"]item_text_before = QQMusic_app.win.child_window(auto_id=item_text_ele["auto_id"],control_type=item_text_ele["control_type"],found_index=0).window_text()scroll_right_ele = rec_ele["今日为你推荐右滚动"]scroll_right = QQMusic_app.win.child_window(auto_id=scroll_right_ele["auto_id"],control_type=scroll_right_ele["control_type"])# 点击右滚动按钮scroll_right.click_input()# 获取推荐项的名称,进行前后对比校验item_text_after = QQMusic_app.win.child_window(auto_id=item_text_ele["auto_id"],control_type=item_text_ele["control_type"],found_index=0).window_text()assert item_text_before != item_text_after'''测试——你的音乐补给滚动区域——左滚动'''def test_supply_scroll_left(self,QQMusic_app):rec_ele = read_yaml("推荐")all_rec_area_ele = rec_ele["推荐整个模块"]all_rec_area = QQMusic_app.win.child_window(auto_id=all_rec_area_ele["auto_id"],control_type=all_rec_area_ele["control_type"])#找推荐整个模块的中间坐标point = all_rec_area.rectangle().mid_point()#在推荐模块鼠标下拉,展示完整的为你推荐区域mouse.scroll(coords=(point.x,point.y),wheel_dist=-500)#点击左滚动按钮scroll_left_ele = rec_ele["音乐补给左滚动"]one_one_ele = rec_ele["音乐补给第一排第一项文本"]two_one_ele = rec_ele["音乐补给第二排第一项文本"]one_one_text_before = QQMusic_app.win.child_window(auto_id=one_one_ele["auto_id"],control_type=one_one_ele["control_type"],found_index=0).window_text()two_one_text_before = QQMusic_app.win.child_window(auto_id=two_one_ele["auto_id"],control_type=two_one_ele["control_type"],found_index=0).window_text()scroll_left_btn = QQMusic_app.win.child_window(auto_id=scroll_left_ele["auto_id"],control_type=scroll_left_ele["control_type"])scroll_left_btn.click_input()#左滚动结果的校验--项目名称是否变化one_one_text_after = QQMusic_app.win.child_window(auto_id=one_one_ele["auto_id"],control_type=one_one_ele["control_type"],found_index=0).window_text()two_one_text_after = QQMusic_app.win.child_window(auto_id=two_one_ele["auto_id"],control_type=two_one_ele["control_type"],found_index=0).window_text()assert one_one_text_after != one_one_text_beforeassert two_one_text_after != two_one_text_before'''测试——你的音乐补给滚动区域——右滚动'''def test_supply_scroll_right(self, QQMusic_app):rec_ele = read_yaml("推荐")all_rec_area_ele = rec_ele["推荐整个模块"]all_rec_area = QQMusic_app.win.child_window(auto_id=all_rec_area_ele["auto_id"],control_type=all_rec_area_ele["control_type"])# 找推荐整个模块的中间坐标point = all_rec_area.rectangle().mid_point()# 在推荐模块鼠标下拉,展示完整的为你推荐区域mouse.scroll(coords=(point.x, point.y), wheel_dist=-500)# 点击右滚动按钮scroll_left_ele = rec_ele["音乐补给右滚动"]one_one_ele = rec_ele["音乐补给第一排第一项文本"]two_one_ele = rec_ele["音乐补给第二排第一项文本"]one_one_text_before = QQMusic_app.win.child_window(auto_id=one_one_ele["auto_id"],control_type=one_one_ele["control_type"],found_index=0).window_text()two_one_text_before = QQMusic_app.win.child_window(auto_id=two_one_ele["auto_id"],control_type=two_one_ele["control_type"],found_index=0).window_text()scroll_right_btn = QQMusic_app.win.child_window(auto_id=scroll_left_ele["auto_id"],control_type=scroll_left_ele["control_type"])scroll_right_btn.click_input()# 左滚动结果的校验--项目名称是否变化one_one_text_after = QQMusic_app.win.child_window(auto_id=one_one_ele["auto_id"],control_type=one_one_ele["control_type"],found_index=0).window_text()two_one_text_after = QQMusic_app.win.child_window(auto_id=two_one_ele["auto_id"],control_type=two_one_ele["control_type"],found_index=0).window_text()assert one_one_text_after != one_one_text_beforeassert two_one_text_after != two_one_text_before


(7)本地下载模块测试用例

import math
import timeimport pytest
from pywinauto import mousefrom Untils.yamlUtils import read_yaml@pytest.mark.order(3)
class TestLocal:'''测试本地下载模块——文本“本地音乐、歌曲名称、歌手名称、专辑名称”'''def test_local_text(self,QQMusic_app):local_ele = read_yaml("本地下载")#点击导航栏-本地下载,进入本地下载页面local = QQMusic_app.win.child_window(auto_id=local_ele["auto_id"],control_type=local_ele["control_type"])local.click_input()#测试“本地音乐文本"local_text_ele = local_ele["本地音乐文本"]local_text = QQMusic_app.win.child_window(auto_id=local_text_ele["auto_id"],control_type=local_text_ele["control_type"]).window_text()assert local_text == "本地⾳乐"#测试“歌曲名称文本"songname_text_ele = local_ele["歌曲名称文本"]songname_text = QQMusic_app.win.child_window(auto_id=songname_text_ele["auto_id"],control_type=songname_text_ele["control_type"]).window_text()assert songname_text == "歌曲名称"#测试“歌手名称文本"singername_text_ele = local_ele["歌手名称文本"]singername_text = QQMusic_app.win.child_window(auto_id=singername_text_ele["auto_id"],control_type=singername_text_ele["control_type"]).window_text()assert singername_text == "歌手名称"#测试“专辑名称文本"Albumname_text_ele = local_ele["专辑名称文本"]Albumrname_text = QQMusic_app.win.child_window(auto_id=Albumname_text_ele["auto_id"],control_type=Albumname_text_ele["control_type"]).window_text()assert Albumrname_text == "专辑名称"'''测试本地下载模块——播放全部功能'''def test_local_playAll(self,QQMusic_app):local_ele = read_yaml("本地下载")playAll_ele = local_ele["播放全部"]playAll_btn = QQMusic_app.win.child_window(auto_id=playAll_ele["auto_id"],control_type=playAll_ele["control_type"])#点击播放全部按钮playAll_btn.click_input()#获取播放进度process_line_ele = read_yaml("播放控制")["当前播放进度"]process_line_before = QQMusic_app.win.child_window(auto_id=process_line_ele["auto_id"],control_type=process_line_ele["control_type"])process_line_len_before = process_line_before.rectangle().right#等待两秒time.sleep(2)#获取播放进度process_line_after = QQMusic_app.win.child_window(auto_id=process_line_ele["auto_id"],control_type=process_line_ele["control_type"])process_line_len_after = process_line_after.rectangle().right#测试前后两个进度是否存在差别assert process_line_len_before != process_line_len_after'''测试本地下载模块——选择歌曲并双击播放'''def test_local_playSingle(self,QQMusic_app):music_list_ele = read_yaml("歌曲列表")music_list = QQMusic_app.win.child_window(auto_id=music_list_ele["auto_id"],control_type=music_list_ele["control_type"])#将歌曲列表还原到最上方——————公共模块测试循环播放找最后一首歌曲将列表拉到了最下面point = music_list.rectangle().mid_point()mouse.scroll(coords=(point.x,point.y),wheel_dist=500)#获取歌曲列表中歌曲数量if music_list.item_count() <= 0:assert 0,"歌曲列表为空"#选择一首歌曲并双击播放point = music_list.get_item(row=0).rectangle().mid_point()mouse.double_click(coords=(point.x,point.y))# 获取播放进度process_line_ele = read_yaml("播放控制")["当前播放进度"]process_line_before = QQMusic_app.win.child_window(auto_id=process_line_ele["auto_id"],control_type=process_line_ele["control_type"])process_line_len_before = process_line_before.rectangle().right# 等待两秒time.sleep(2)# 获取播放进度process_line_after = QQMusic_app.win.child_window(auto_id=process_line_ele["auto_id"],control_type=process_line_ele["control_type"])process_line_len_after = process_line_after.rectangle().right# 测试前后两个进度是否存在差别assert process_line_len_before != process_line_len_after'''将歌曲标记喜欢——为了后面我喜欢模块的测试提供数据'''def test_mark_like(self,QQMusic_app):#获取歌曲列表中歌曲数量music_list_ele = read_yaml("歌曲列表")music_list = QQMusic_app.win.child_window(auto_id=music_list_ele["auto_id"],control_type=music_list_ele["control_type"])list_size = music_list.item_count()#对每一首歌曲标记喜欢for i in range(0,list_size):if i != 0 and i % 6 == 0:#6及以后的歌曲在标记喜欢之前需要先向下滑动,使其显示出来point = music_list.rectangle().mid_point()mouse.scroll(coords=(point.x,point.y),wheel_dist=-500)rec = music_list.get_item(row=i).rectangle()#获取爱心的中间位置(x,y)y = math.floor((rec.top + rec.bottom)/2)x = rec.left + 22mouse.click(coords=(x,y))


(8)我喜欢模块测试用例

import math
import timeimport pytest
from pywinauto import mousefrom Untils.yamlUtils import read_yaml@pytest.mark.order(4)
class TestLike:'''测试我喜欢——文本“我喜欢、歌曲名称、歌手名称、专辑名称”'''def test_like_text(self,QQMusic_app):like_ele = read_yaml("我喜欢")#点击导航栏“我喜欢”进入到我喜欢模块like_btn = QQMusic_app.win.child_window(auto_id=like_ele["auto_id"],control_type=like_ele["control_type"])like_btn.click_input()#测试“我喜欢”文本like_text_ele = like_ele["我喜欢文本"]like_text = QQMusic_app.win.child_window(auto_id=like_text_ele["auto_id"],control_type=like_text_ele["control_type"]).window_text()assert like_text == "我喜欢"#测试“歌曲名称”文本songname_text_ele = like_ele["歌曲名称文本"]songname_text = QQMusic_app.win.child_window(auto_id=songname_text_ele["auto_id"],control_type=songname_text_ele["control_type"]).window_text()assert songname_text == "歌曲名称"#测试“歌手名称”文本singername_text_ele = like_ele["歌手名称文本"]singername_text = QQMusic_app.win.child_window(auto_id=singername_text_ele["auto_id"],control_type=singername_text_ele["control_type"]).window_text()assert singername_text == "歌手名称"#测试“专辑名称”文本albumrname_text_ele = like_ele["专辑名称文本"]albumrname_text = QQMusic_app.win.child_window(auto_id=albumrname_text_ele["auto_id"],control_type=albumrname_text_ele["control_type"]).window_text()assert albumrname_text == "专辑名称"'''我喜欢模块——播放全部'''def test_like_playAll(self,QQMusic_app):playAll_ele = read_yaml("我喜欢")["播放全部"]playAll_btn = QQMusic_app.win.child_window(auto_id=playAll_ele["auto_id"],control_type=playAll_ele["control_type"])#点击播放全部按钮playAll_btn.click_input()#获取播放进度process_line_ele = read_yaml("播放控制")["当前播放进度"]process_line_before = QQMusic_app.win.child_window(auto_id=process_line_ele["auto_id"],control_type=process_line_ele["control_type"])process_line_len_before = process_line_before.rectangle().right#等待两秒time.sleep(2)#获取播放进度process_line_after = QQMusic_app.win.child_window(auto_id=process_line_ele["auto_id"],control_type=process_line_ele["control_type"])process_line_len_after = process_line_after.rectangle().right#比较前后两次进度变化,有变化则说明按钮没有问题assert process_line_len_before != process_line_len_after'''我喜欢模块——选择歌曲双击播放'''def test_like_playSingle(self,QQMusic_app):music_list_ele = read_yaml("我喜欢")["歌曲列表"]music_list = QQMusic_app.win.child_window(auto_id=music_list_ele["auto_id"],control_type=music_list_ele["control_type"])#获取歌曲列表歌曲数量list_size = music_list.item_count()if list_size <= 0:assert 0,"歌曲列表为空"#选择第一首歌曲双击播放point = music_list.get_item(row=0).rectangle().mid_point()mouse.double_click(coords=(point.x,point.y))# 获取播放进度process_line_ele = read_yaml("播放控制")["当前播放进度"]process_line_before = QQMusic_app.win.child_window(auto_id=process_line_ele["auto_id"],control_type=process_line_ele["control_type"])process_line_len_before = process_line_before.rectangle().right# 等待两秒time.sleep(2)# 获取播放进度process_line_after = QQMusic_app.win.child_window(auto_id=process_line_ele["auto_id"],control_type=process_line_ele["control_type"])process_line_len_after = process_line_after.rectangle().right# 比较前后两次进度变化,有变化则说明双击歌曲播放没有问题assert process_line_len_before != process_line_len_after'''我喜欢模块——测试标记喜欢'''def test_mark_unLike(self,QQMusic_app):#获取歌曲列表中歌曲的数量music_list_ele = read_yaml("我喜欢")["歌曲列表"]music_list_before = QQMusic_app.win.child_window(auto_id=music_list_ele["auto_id"],control_type=music_list_ele["control_type"])# 获取歌曲列表歌曲数量list_size_before = music_list_before.item_count()#取消标记喜欢rec = music_list_before.get_item(row=0).rectangle()y = math.floor((rec.top + rec.bottom)/2)x = rec.left + 22mouse.click(coords=(x,y))#获取歌曲列表中歌曲的数量music_list_after = QQMusic_app.win.child_window(auto_id=music_list_ele["auto_id"],control_type=music_list_ele["control_type"])# 获取歌曲列表歌曲数量list_size_after = music_list_after.item_count()#测试取消标记喜欢是否成功assert list_size_after + 1 == list_size_before

(9)歌词模块测试用例

import timeimport pytestfrom Untils.logUntil import Logger
from Untils.yamlUtils import read_yaml@pytest.mark.order(5)
class TestSongWords:logger = Logger.getlog()'''测试歌词页面的标题“歌手名、歌曲名”'''def test_title_text(self,QQMusic_app):song_word_page_ele = read_yaml("歌词入口")song_ele=read_yaml("播放控制")song_word_btn = QQMusic_app.win.child_window(auto_id=song_word_page_ele["auto_id"],control_type=song_word_page_ele["control_type"])#点击页面的歌词入口,进入到歌词页面song_word_btn.click_input()#获取歌手名文本singer_text_ele = song_word_page_ele["歌手标题文本"]singer_text = QQMusic_app.win.child_window(auto_id=singer_text_ele["auto_id"],control_type=singer_text_ele["control_type"]).window_text()singer_text_ele2= song_ele["歌手名"]singer_text2 = QQMusic_app.win.child_window(auto_id=singer_text_ele2["auto_id"],control_type=singer_text_ele2["control_type"]).window_text()#校验歌手名文本assert singer_text == singer_text2#获取歌曲名文本song_text_ele = song_word_page_ele["歌曲名标题文本"]song_text = QQMusic_app.win.child_window(auto_id=song_text_ele["auto_id"],control_type=song_text_ele["control_type"]).window_text()song_text_ele2 = song_ele["歌曲名"]song_text2 = QQMusic_app.win.child_window(auto_id=song_text_ele2["auto_id"],control_type=song_text_ele2["control_type"]).window_text()#校验歌曲名文本assert song_text == song_text2'''歌词页面——测试歌词从头播放歌曲并立即暂停————才能获取到歌词列表中的歌手名和歌曲名'''def test_songwords(self, QQMusic_app):likepage_ele = read_yaml("我喜欢")wordspage_ele = read_yaml("歌词入口")# 收起歌词页面hide_word_page_ele = wordspage_ele["收起歌词"]hide_word_page_btn = QQMusic_app.win.child_window(auto_id=hide_word_page_ele["auto_id"],control_type=hide_word_page_ele["control_type"])hide_word_page_btn.click_input()# 为后面的测试用例做准备————点击播放歌曲并立即暂停playAll_ele = likepage_ele["播放全部"]playAll_btn = QQMusic_app.win.child_window(auto_id=playAll_ele["auto_id"],control_type=playAll_ele["control_type"])playAll_btn.click_input()# 立即暂停播放play_ele = read_yaml("播放控制")["播放"]play_btn = QQMusic_app.win.child_window(auto_id=play_ele["auto_id"],control_type=play_ele["control_type"])play_btn.click_input()# 获取当前正在播放的歌手名和歌曲名play_control_ele = read_yaml("播放控制")singer_name_ele = play_control_ele["歌手名"]song_name_ele = play_control_ele["歌曲名"]singer_name = QQMusic_app.win.child_window(auto_id=singer_name_ele["auto_id"],control_type=singer_name_ele["control_type"]).window_text()song_name = QQMusic_app.win.child_window(auto_id=song_name_ele["auto_id"],control_type=song_name_ele["control_type"]).window_text()# songwordsText = f"{song_name} - {singer_name}"# 进入歌词页面song_word_page_ele = read_yaml("歌词入口")song_word_btn = QQMusic_app.win.child_window(auto_id=song_word_page_ele["auto_id"],control_type=song_word_page_ele["control_type"])# 点击页面的歌词入口,进入到歌词页面song_word_btn.click_input()# 测试歌词words_list_ele = wordspage_ele["歌词列表"]words_list = QQMusic_app.win.child_window(auto_id=words_list_ele["auto_id"],control_type=words_list_ele["control_type"])for i in words_list.children():if i.window_text() in song_name or i.window_text() in singer_name:returnself.logger.info(f"获取到的歌词:{i.window_text()}")# 始终没有匹配上raise Exception(f"歌词匹配失败,song_name:{song_name},singer_name{singer_name}")

六、执行测试用例

七、生成测试报告

可以看到23个测试用例均已测试通过。

http://www.dtcms.com/a/586776.html

相关文章:

  • 城市分类信息网站系统wordpress 模板 门户
  • Java刷题100天(连载)
  • 可以分4天做任务的网站wordpress变灰
  • 做网站张家口wordpress菠菜插件
  • JAR文件句柄泄漏问题分析与解决方案
  • 布吉做棋牌网站建设哪家公司便宜开发微信公众
  • 达梦数据库监听进程
  • 五屏网站建设品牌linux下搭建wordpress
  • Falcon-RX PTP交换机
  • 不买域名怎么做网站泰安人才网最新招聘
  • 【每天一个AI小知识】:什么是模型蒸馏?
  • 兰溪市建设局官方网站网站怎么做优化百度能搜索到
  • 如何删除网站的信息吗网页是怎么做的
  • 网站开发费入什么科目专门做民宿的网站有哪些
  • 阳泉建设局网站搜索引擎营销就是seo
  • 网站建设的七个步骤网站如何验证登陆状态
  • 深圳知名网站建设公司主要的网站开发技术路线
  • 做网站用别人的图片泉州网站建设培训
  • 深圳专业英文网站建设建筑人才直聘网
  • 个人网站备案地址选择惠州手工外发加工网
  • 高防服务器在网络游戏中的优势
  • 微商城网站建设策划网站建设简讯
  • 在 Go 语言中,模板字符串
  • PPT导出为图片的格式选择:JPG与PNG的区别
  • 开封网站建设流程与开发步骤免费正版高清素材库
  • K8S第二次安装
  • 手机上怎么上传网站什么是网络营销与策划
  • 港股上市只是起点:张兴海重塑赛力斯战略蓝图
  • JavaScript对DOM文本内容进行瞬间替换分析
  • 大模型领域部分资源平台汇总