自动化工具 C/S 架构系统自动化测试入门

Joo · 2017年12月06日 · 最后由 Joo 回复于 2018年07月30日 · 3501 次阅读

所谓 C/S 架构即 Client/Server(客户端/服务器架构)。虽然近年来 C/S 架构产品越来越少,大有被 B/S(Browser/Server 浏览器/服务器)架构超越的趋势,但 C/S 还是有 B/S 不可替代的优势 (如系统速度快,用户体验好,处理能力强且可以实现复杂业务功能等)。

本文以网易云音乐客户端为例,介绍 C/S 结构系统自动化测试方法,操作系统为 Windows10,使用工具为 Python2.7+AutoIT v3。

1. AutoIT 介绍

1.1 AutoIt 简介

AutoIt 是用以编写并生成具有 BASIC 语言风格的脚本程序的免费软件,它被设计用来在 WindowsGUI(用户界面) 中进行自动操作。通过它可以组合使用模拟键击,鼠标移动和窗口/控件操作等来实现自动化任务。AutoIt 非常小巧,可以在所有 windows 操作系统上运行,且不需要任何运行库。官网:https://www.autoitscript.com

1.2 AutoIt 下载安装

直接从官网下载最新版本(v3.3.14.2)后安装即可,下载地址:https://www.autoitscript.com/site/autoit/downloads/

同时,我也上传到了百度网盘,还有两本中文帮助文档,推荐大家下载。链接: https://pan.baidu.com/s/1NNariF-WBehHPydzi2VsnA 密码: zffm

1.3 AutoIt 快速入门

对于没有接触过 AutoIt 的同学,建议详细阅读下我上传的手册《AutoIt3CHS.chm》,里面有详细的入门教程。这里只做简单的介绍:

1) 首先安装完成之后,你会看到 AutoIt v3 安装目录如下:

其中 AutoIt Help File 是帮助手册,AutoIt Window Info 是窗口信息工具(x64 或 x86 分别代表 64 位或 32 位版本),Compile Script to .exe 是打包工具(打包 au3 脚本为 exe 文件),Run Script 是运行脚本工具,SciTE Script Editor 是脚本编辑器即 IDE。

2) 我们运行 SciTE Script Editor,输入如下代码(弹出消息框,输出 Hello World)

MsgBox(0,'Hello World','AutoIt Demo by Lovesoo')

3) Ctrl+S 保存当前文件

4) F5 运行,结果如下

2. C/S 架构客户端自动化测试

下面我们以网易云音乐客户端为例,详细介绍 C/S 架构客户端如何实现自动化测试。

首先我们设想一个基本的测试流程如下:运行网易云音乐-> 搜索歌曲并播放 -> 校验播放歌曲是否正确

下面我们使用 AutoIT 及 Python+AutoIt 分别实现相应的自动化测试:

2.1 AutoIt 版

2.1.1 运行网易云音乐

运行网易云音乐客户端命令非常简单,如下我们定义了网易云音乐客户端路径,使用 Run 函数运行即可,并使用 Sleep 函数等待 5 秒至客户端启动完成:

;定义相关参数
$cloudmusic_path="C:\Program Files (x86)\Netease\CloudMusic\cloudmusic.exe"

;运行网易云音乐
Run($cloudmusic_path)
Sleep(5000)

下面,我们使用 WinWaitActive 函数,等待网易云音乐客户端窗口弹出并成为激活状态,这时我们首先需要使用 AutoIt Window Info 获取窗口信息:

1) 运行网易云音乐客户端

2)运行 AutoIt Window Info (x64)

3) 使用快捷键 Ctrl+Alt+F 激活窗口信息工具

4) 鼠标点击网易云标题栏,并使用快捷键 Ctrl+Alt+F 锁定窗口信息工具,可以看到此时我们获取的网易云音乐客户端的窗口信息包括 Title,Class 等

5) 这里我们使用 Class:OrpheusBrowserHost 作为 WinWaitActive 参数 (因为 Title 不固定是 “网易云音乐”,当播放歌曲时为歌曲信息)

$cloudmusic_title="[CLASS:OrpheusBrowserHost]"

;等待网易云音乐窗口激活
WinWaitActive($cloudmusic_title)

2.1.2 搜索歌曲并播放

下面我们在等待激活网易云音乐客户端窗口后,去搜索栏输入歌曲名称完成搜索及播放,同样我们使用窗口信息工具尝试获取搜索栏控件信息,发现无法正常获取搜索栏控件信息(鼠标云音乐标题栏移动至搜索栏时,Control Info 没有任何变化)

这是由于 AutoIt 只支持标准的 Microsoft 控件,这样我们就只能使用模拟键盘鼠标操作的方法了。我们发现,在打开网易云音乐后,按 TAB 键 5 下会切换到搜索栏,此时输入歌曲名,再按向下键 3 下会选中第一首搜索歌曲,按回车即可播放,实现代码如下:

$song="红玫瑰"

;按5下TAB切换至搜索框
Send("{TAB 5}")

;搜索歌曲
Send($song)
Sleep(1000)

;按3下向下键选择第一首歌曲
Send("{DOWN 3}")
Sleep(1000)

;按回车键播放歌曲
Send("{ENTER}")
Sleep(1000)

2.1.3 校验播放歌曲是否正确

下面我们校验播放的歌曲是否为我们搜索的歌曲,此时只需校验网易云音乐客户端标题即可,代码如下:

;校验当前窗口标题是否含有搜索歌曲名
$title = WinGetTitle($cloudmusic_title)
if StringInStr($title,$song) Then
   MsgBox(0, "测试通过", $song&" in "&$title,2)
Else
   MsgBox(16, "测试失败", $song&" not in "&$title)
EndIf

2.1.4 关闭网易云音乐窗口

最后我们使用 WinClose 函数即可关闭网易云音乐窗口:

;关闭窗口
WinClose($cloudmusic_title)

2.1.5 完整 AutoIt 代码

使用 AutoIt 进行网易云音乐客户端自动化测试,完整版示例 demo 如下:

;定义相关参数
$cloudmusic_path="C:\Program Files (x86)\Netease\CloudMusic\cloudmusic.exe"
$cloudmusic_title="[CLASS:OrpheusBrowserHost]"
$song="红玫瑰"

;运行网易云音乐
Run($cloudmusic_path)
Sleep(5000)

;等待网易云音乐窗口激活
WinWaitActive($cloudmusic_title)

;按5下TAB切换至搜索框
Send("{TAB 5}")

;搜索歌曲
Send($song)
Sleep(1000)

;按3下向下键选择第一首歌曲
Send("{DOWN 3}")
Sleep(1000)

;按回车键播放歌曲
Send("{ENTER}")
Sleep(1000)

;校验当前窗口标题是否含有搜索歌曲名
$title = WinGetTitle($cloudmusic_title)
if StringInStr($title,$song) Then
   MsgBox(0, "测试通过", $song&" in "&$title,2)
Else
   MsgBox(16, "测试失败", $song&" not in "&$title)
EndIf

;关闭窗口
WinClose($cloudmusic_title)

2.2. Python+AutoIt

Python 中同样有 AutoIt lib 库PyAutoIt,我们使用 pip 命令安装即可

pip install -U pyautoit

官方示例 demo(打开 notepad 记事本,输入 hello world,然后不保存退出 notepad )如下:

import autoit

autoit.run("notepad.exe")
autoit.win_wait_active("[CLASS:Notepad]", 3)
autoit.control_send("[CLASS:Notepad]", "Edit1", "hello world{!}")
autoit.win_close("[CLASS:Notepad]")
autoit.control_click("[Class:#32770]", "Button2")

同样我们将上面的 AutoIt 脚本改为 Python 版本(注意:autoit 函数全部改为小写,以 autoit.打头,且多个单词以_分割)如下:

# coding:utf-8
import autoit
import time

#定义相关参数
cloudmusic_path="C:\Program Files (x86)\Netease\CloudMusic\cloudmusic.exe"
cloudmusic_title="[CLASS:OrpheusBrowserHost]"
song=u"红玫瑰"

#运行网易云音乐
autoit.run(cloudmusic_path)
time.sleep(5)

#等待网易云音乐窗口激活
autoit.win_wait_active(cloudmusic_title)

#按5下TAB切换至搜索框
autoit.send("{TAB 5}")

#搜索歌曲
autoit.send(song)
time.sleep(1)

#按3下向下键选择第一首歌曲
autoit.send("{DOWN 3}")
time.sleep(1)

#按回车键播放歌曲
autoit.send("{ENTER}")
time.sleep(1)

#校验当前窗口标题是否含有搜索歌曲名
title = autoit.win_get_title(cloudmusic_title)
assert song in title,song.encode('utf-8')+' not in '+title.encode('utf-8')

#关闭窗口
autoit.win_close(cloudmusic_title)

2.3 Python + AutoIt +Nosetests

我们还可以把上述脚本改为使用 Nosetests 框架的脚本,如下:

# coding:utf-8
import autoit
import time


class test_cloudmusic(object):

    # 定义相关参数
    cloudmusic_path = "C:\Program Files (x86)\Netease\CloudMusic\cloudmusic.exe"
    cloudmusic_title = "[CLASS:OrpheusBrowserHost]"
    song = u"红玫瑰"

    def test_search(self):
        # 运行网易云音乐
        autoit.run(self.cloudmusic_path)
        time.sleep(5)

        # 等待网易云音乐窗口激活
        autoit.win_wait_active(self.cloudmusic_title)

        # 按5下TAB切换至搜索框
        autoit.send("{TAB 5}")

        # 搜索歌曲
        autoit.send(self.song)
        time.sleep(1)

        # 按3下向下键选择第一首歌曲
        autoit.send("{DOWN 3}")
        time.sleep(1)

        # 按回车键播放歌曲
        autoit.send("{ENTER}")
        time.sleep(1)

        # 校验当前窗口标题是否含有搜索歌曲名
        title = autoit.win_get_title(self.cloudmusic_title)
        assert self.song in title, self.song.encode('utf-8') + ' not in ' + title.encode('utf-8')

        # 关闭窗口
        autoit.win_close(self.cloudmusic_title)

使用 nosetests -v test_xxx.py 即可运行测试,结果如下:

至此我们使用 Python + AutoIt,并结合 Nosetests 框架完成了一个 C/S 架构客户端的自动化测试示例 demo,此外还可以集成相关插件完成测试报告输出及邮件发送等功能,可以参考上一篇《接口自动化测试,完整入门篇》,在此恕不赘述。

获取更多信息,欢迎加入测试开发交流群:25452556

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 10 条回复 时间 点赞

大大棒棒哒

按。。。按键精灵

Joo #3 · 2017年12月07日 Author
Zhhh 回复

可能示例举的不是很好,但是有的时候真的只能通过模拟按键或者鼠标定位的方式才可以实现自动化😭 或者是我没找到更好的方法吧😭

可以去看看 sikuli ~ 好玩多啦。

sikuli 是认像素位置的,对机器的分辨率和窗口要求都比较高,维护成本是不是太高了

.net framework 自带的 UI Automation 做自动化也是可以的

感谢分享,另外, 你百度的下载链接失效了,能重新发一个不。

Joo 回复

十分感谢!另外我想请问一下楼主,有没有关于 autoIT 的教程或者书籍。我跟着你的例子敲出来,在 assert 那里报了一个错。后来发现,在连按五次 Tab 那里就出问题了,那段代码执行没有反应,我不知道是没有虚拟按五下还是哪里不对,还请指教。

Joo #10 · 2018年07月30日 Author

我刚试了下脚本是 OK 的,win10 + python 2.7 环境,建议你再试下看看,注意运行 UI 自动化脚本时,不要移动鼠标键盘。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册