全国大学生软件测试大赛赛后总结

本文最后更新于:2021年11月28日 晚上

1
2
graph LR
A-->B

说在前面

总的来说这个比赛真的不算特别难,相较于我参加过的其他比赛以蓝桥杯为例,这种算法比赛更需要参赛者的算法功底与逻辑推理能力。但今天我们说的软测比赛个人看来更是一个考察经验的比赛,熟能生巧。也就是说即使你没有很聪明的头脑,也没有很强的语言基础也可以胜任这个比赛。

但是很多当初一起报名参加的小伙伴都半路退出了是十分令人觉得可惜的。赛后想来究其原因只有二字——毅力。无论是这个比赛还是其他比赛其他的事情,轻言放弃都是无法有所收获的,所以在看这篇文章的同学,相信大概率你正犹豫要不要参加这个比赛,那么既然你都来到了这里,你需要做的就是相信你自己,然后坚持练习。

关于比赛

比赛分为5个赛项,而我参加了其中三者,所以下文也就介绍这三者

比赛主要使用的语言是Java,如果之前没有使用过或者不熟悉没关系,只要有C语言的知识即可,能看得懂基本的语法就可以。因为我就不熟悉Java

比赛在难度不大的情况下,晋级规则为:预选赛->省赛->国赛

  • 预选赛只要有一定成绩的选手都会晋级

这个一定的尺度我也不大懂,按理说是有成绩就应该都晋级啊,因为我当时有一个赛项就得了20分,都晋级了,但是老师和我说有的人确实被淘汰了,所以我就很迷.

  • 省赛的时候会筛人,每个省的前三名直通总决赛,总决赛有一定的人数限制,如果每个省取够了前三名,那么就将所有没有直接晋级的选手进行成绩的大排名,将剩余名额分配.晋级的选手省赛证书都是省一等,其余没晋级的选手分别获得二等和三等.
  • 到国赛之后就残酷的多了,因为都是各个省份来的前几名的选手,很多人还是参加过好多次,已经很有经验了.最后我排名19名也才获得了三等奖.

比赛官方资料

比赛官方是给提供了一些文档和教学视频的:

  • 视频

开发者测试视频

移动端测试视频

自主可控测试视频

  • 文档

开发者测试文档

移动端测试文档

移动端测试脚本编写要求

自主可控测试文档-功能部分

自主可控测试文档-性能部分

  • 其他

比赛平台:
www.mooctest.net

大赛官网:
www.mooctest.org

比赛详细说明

不同的赛项有各自的不同,出于便于浏览的目的,各个赛项的详细说明在此查阅.

自主可控测试

移动端测试

开发者测试

比赛总体环境配置

该比赛使用的语言为Java,使用的编译器为Eclipse,比赛中需要使用到比赛提供的插件mooctest,比赛试题的下载、提交都需要通过该插件

  1. 安装Java,Java版本强烈建议使用Java8,否则会出现莫名其妙的问题,安装的来源选择官网的即可
    ,Java安装的具体步骤参照百度,这里无需多言。
  2. Eclipse的安装有两个途径:

比赛主办方版本的已经安装好插件无需自己安装,但是对我来说这个不太好用,所以我选择从Eclipse官网安装,自己安装插件,插件的下载地址为:插件,Eclipse安装插件的方法也请查询百度。

这里强调一下,插件会随着比赛推进进行更新,所以记得更新插件,不然会出现题目提交不上的问题

  1. 环境变量配置
  • 新建 JAVA_HOME 变量
    变量内容为Java安装路径
    image.png

  • 新建/修改 CLASSPATH 变量
    变量内容为

1
2
3
4
5
6
;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
```
![image.png](https://img.hacpai.com/file/2020/01/image-d6aa8e09.png)

- 添加环境变量
在**Path**变量中加入

%JAVA_HOME%\bin
%JAVA_HOME%\jre\bin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
## 自主可控测试

>这个是19年新加入的赛项,在我看来这个赛项最简单也最容易得分,如果你想参赛却对5个赛项都不很擅长,推荐选择这个。

自主可控测试听起来可能让人摸不到头脑,但是如果之前你接触过**爬虫**,你就会很容易理解和上手,没错这个赛项就是考察**Selenium**的相关知识。如果你说你也没有接触过,那么也没关系继续向下看就可以了。

### 题目类型
本赛项共分为三部分:
1. 功能测试
2. 性能测试
3. 众包测试(总决赛才会有)

如果只是前两部分的话,就各占50%的分值,三部分的话就每个33%的分值。

### 功能测试

---
#### 0. 环境配置
- 首先是浏览器,建议**Chrome**作为测试和编写脚本过程中使用,**360**最后提交成绩时使用,所以两个浏览器建议都下载。
- Chromedriver,这个是Selenium驱动浏览器的驱动程序,这个驱动程序的版本需要与你浏览器的版本对应。
- [对照表](https://blog.csdn.net/BinGISer/article/details/88559532)
- [驱动下载](http://npm.taobao.org/mirrors/chromedriver/)
- Selenium包[下载](http://www.mooctest.net/download),下载后放在**C://mooctest**目录下
- 环境变量配置,Chromedriver的路径需要加入环境变量中,将**C://mooctest**加入环境变量,还需再在系统变量中加入如下图的变量,变量的值为**360chrome.exe**所在路径
![image.png](https://img.hacpai.com/file/2020/01/image-4ab6181b.png)

#### 1.Selenium
- **Selenium**是一种自动化测试工具,主要测试对象为WEB网页,既然是对网页进行测试,那么网页的大概结构你就需要了解网页的大概结构,你所看到的网页都是由静态的**HTML**语言构成的,就类似于这种

![image.png](https://img.hacpai.com/file/2020/01/image-88a5c7bd.png)

你可能会说这是啥呀,我根本看不懂啊,不用担心,参加这个比赛并不需要你看懂网页,千万不要有畏惧心理.

#### 2. Chrome
- 熟悉Chrome浏览器的使用,因为这个浏览器是最好用的浏览器,还因为额....
>所谓的自主可控呢,就是在国产浏览器(赛事方要求360浏览器或者QQ浏览器)上进行测试,但是我心想国产的浏览器你用的不还是Chrome内核吗?

- 在Chrome浏览器中打开任意一个网页按F12调出**开发者工具**

![image.png](https://img.hacpai.com/file/2020/01/image-d6987aed.png)

>对就是右边这个东西了,接下来参照我下面的视频

[Chrome开发者工具使用](https://img.hacpai.com/file/2020/01/20200110134647-62ffc227.mp4)
>在视频中你可以发现
>1. 我先点击了一下开发者工具窗口上方的*选择*按钮
>2. 接着我移动鼠标,点击了原网页的输入框,这时你会发现右侧的代码区域发生了变化,有一段代码的背景变为浅蓝色,没错这就是有关**输入框**属性的全部代码
>3. HTML语言中每个控件都是由一段代码描述,这段代码由 **<** 起始由 **>** 结束,控件的类型有“文本”、“图片”,“输入框”、“选框”等等
>4. 如果我们此时想要操作这个控件,那么OK既然我们已经找到了目标

[获取控件Xpath](https://img.hacpai.com/file/2020/01/20200110140533-37d03f98.mp4)

> 1. 这个视频中我所做的操作为:获取控件的 **Xpath**——
//*[@id=\"kw\"],可以理解为获取可以唯一缺定控件的标识
> 2. 拿到这个 **Xpath** 后我们的使用Chrome的操作就结束了,接下来就可以利用这个Xpath去写代码了


#### 3. 代码编写
前面提到使用插件,在登陆后可以进行代码下载,代码下载后,可以看到提供文件里,主文件 *Example.java* 中存在一部分模板代码

![image.png](https://img.hacpai.com/file/2020/01/image-0a489c45.png)

这部分代码是不需要你弄懂的,你只需要在test函数内部继续编写主要功能代码即可。


![image.png](https://img.hacpai.com/file/2020/01/image-20e2dc2c.png)

>例如下面我加入了三条语句
> 1.第一条我驱动浏览器访问"www.baidu.com"
> 2.第二条我根据我们前面获得的**Xpath**,找到控件,并点击
> 3.第三条同第二条类似,选中控件,并输入内容“百度”

到这里你已经可以进行简单的测试了,想要进一步了解的同学,请继续向下看进阶部分

### 进阶

这部分我会介绍一些,Selenium的高级用法,使用一些更加灵活的方式对控件进行定位,也会介绍比赛时一些需要注意的地方。

#### 1. 定位

上文我们举出的百度例子中
```Java
driver.findElement(By.xpath("//*[@id=\"kw\"]")).click();

我们可以用这句话代替

1
driver.findElement(By.id("kw")).click();

我们再来看下输入框的代码段

1
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">

没错我们可以用这个控件的某一个特别属性值去定位他,按照这个道理,我们还可以用这样去定位

1
driver.findElement(By.className("s_ipt")).click();

classname这个属性通常会出现多个控件相同的情况,这样程序就没办法分清谁是谁了,不过id一般不会相同,建议使用id去定位,不过也不排除例外,话是要活学活用

定位后可进行的操作:

  • 点击,上文介绍过了,做基本的操作
1
driver.findElement(By.xxxxxxxxxx).click();
  • 传参
1
driver.findElement(By.xxxxxxxxxx).sendKeys("xxxxxx");
  • 清空
1
driver.findElement(By.xxxxxxxxxx).clear();

2. 切换

切换是考试中的难点,问题的考察都会将点击等简单操作与界面的切换结合,也就是说想要操作控件必须切换到其他的界面上才可以进行操作,直接点击的动作,程序会报错,提示你找不到这个元素。

再说一句,当你确定你的Xpath在没问题的情况下,怎么都点击不到元素,这个时候你就需要考虑是不是元素不在当前的页面内的原因了。

界面的切换分为以下两种:

  • iframe

这个几乎是必考的,本届比赛每个阶段的比赛都出现了。

我以网易云这个界面为例
image.png

可以看到标黄这一行的标签为==iframe==,如果你在HTML代码中发现了iframe一定要进行注意。
因为根据HTML的结构,一个网页的代码的结构为:

1
2
3
4
5
6
7
8
<html>
<head>
....
</head>
<body>
....
</body>
</html>

你可以通过Xpath、Id、Class等属性获取<body>....</body>内部的控件信息,但<iframe>....</iframe>内部的内容除外。

好比是你在==body文件夹==中,这个文件夹中有很多==文件==和一个==iframe文件夹==,你可以直接看到到body文件夹中的文件,但是iframe文件夹中的内容你是没办法直接看到的,但是在body中你可以看到和找到iframe。

如果你想获取iframe中控件的内容或者操作其中的控件,那么你需要切换至iframe中。使用的语句为:

1
driver.switchTo().frame(reference);

reference是传入的参数,用来定位frame,可以传入id、name、index以及selenium的WebElement对象,假设有如下HTML代码 index.html:

1
2
3
4
5
6
7
8
<html lang="en">
<head>
<title>FrameTest</title>
</head>
<body>
<iframe src="a.html" id="frame1" name="myframe"></iframe>
</body>
</html>
1
2
3
4
5
6
7
8
driver.switch_to.frame(0)  
# 1.用frame的index来定位,第一个是0
driver.switch_to.frame("frame1")
# 2.用id来定位
driver.switch_to.frame("myframe")
# 3.用name来定位
driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))
# 4.用WebElement对象来定位

我们回到网易云音乐这个例子,可以看到body代码块中并列着两个iframe代码块,如果此时我们已经切换至第一个iframe中,进行操作后想要操作body中的内容,或者切换至第二个iframe中,那么不进行任何切换就直接去定位一样是行不通的,因为你目前所处的位置是iframe这个文件夹中,你是看不到上一层文件夹中的信息的,所以我们需要退回到body中,使用的语句为:

1
driver.switchTo().defaultContent();

这条语句是直接退回到最外层代码块中,在多层iframe嵌套的情况下,如果只想退回到上一层,可以使用:

1
driver.switchTo().parentFrame();
  • 标签页

这个我在练习题目中遇到了,认为是难点之一但是比赛并未出现,注意一下吧,这里我使用了一个比较简单粗暴的办法,切换到最新打开的标签页。

1
2
3
for(String handle:driver.getWindowHandles()) {
driver.switchTo().window(handle);
}

Other

  1. 在定位控件时,使用Xpath进行定位虽然是最无脑的办法,但是这种方式十分有可能不稳定,有ID等属性且没有多个控件共用该属性的情况下,建议使用属性进行定位。
  2. 每个操作之间建议进行一定时间的等待。无等待点击容易使程序获取不到控件导致程序执行失败。
  3. 使用Eclipse自带运行按钮进行运行时,拉起的浏览器为Chrome,使用插件的运行并提交按钮运行时会拉起360浏览器,这时记得将360浏览器切换至极速模式
  4. 有一些Chrome插件可以录制操作,生成驱动Selenium的代码,但是这些代码一般都是使用Xpath定位,不能保证百分之百正确。

image.png

往届试题

自主可控试题

自主可控省赛参考答案

因为比赛中进行测试的网页是特定的网页,所以比赛结束后已经无法访问,这里提供出试题的意思,希望可以让以后参加的同学了解以下试题的难度,试题中有一套==美团==的试题,这个难度适中,希望各位可以好好练习一下。

性能测试


性能测试的难度与功能测试相比,就是白送分的题目,选手若想获得一定的成绩必须将性能测试部分的分数全部得到,当然性能测试的难度很小,操作固定只要记住操作,按图索骥即可得分。

0. Jmeter

这个是性能测试的主要工具,也是比赛试题提交的工具。
下载必须通过比赛官方的渠道进行下载,赛方提供的版本内置了插件,可以提交试题。

下载链接:Jmeter

1. Badboy

这个是生成Jmeter脚本的工具。

下载链接: Badboy

2. Jmeter&Badboy 使用方法

这个参照大赛提供的指导视频就可以了,但需要注意在Jmeter设置参数的过程中

image.png

image.png

这几个参数需要注意,合理的设置才能得到参数化的分。

往届试题

性能测试省赛

性能测试省赛答案

移动应用测试

移动应用测试与自主可控测试类似,主要进行的操作为:
1.定位控件
2.操作控件
自主可控使用的工具名为Selenium,而移动应用测试使用的工具名为Appium,可以发现两个工具的名字十分相似,因此也印证了我上面所说的,两者类似。我非常建议想要去参加移动应用测试的同学顺便也参加一下自主可控测试因为两个比赛殊途同归。

言归正传我们介绍一下移动应用测试参赛的主要内容

0.Appium 的概述与安装

Appium是一个对移动端应用进行测试的软件,使用他可以获取应用当前界面中控件的属性,进而进行定位、操作,还可以录制脚本、导出脚本。

Appium的安装可以参照我的另一篇教程:Appium自闭之旅

1. 模拟器安装

Selenium是驱动浏览器进行测试的,而Appium是驱动手机进行测试的,该比赛的软件环境建议在不高于Android 6的环境下进行,但是现在的手机都已经更新到Android 9了,用自己的手机就会出现测试上的问题,所以建议大家使用模拟器进行测试。

模拟器的选择,建议大家使用雷电模拟器,这个结论是我们在尝试了5款市面上常用的模拟器后得出的。模拟器大家自行进行下载即可,下载之后将你将要进行测试的APP拉至模拟器中,模拟器就会安装该APP。

2. Appium 的使用及代码编写

我觉得移动应用测试的很大一部分障碍就在于软件的安装,如果你已经安装好软件,那么你已经克服了百分之五十的困难。

在Appium配置好左下角的所需功能后,启动会话,可以得到以下的界面(我这里随便以一个应用为例)

image.png

Appium的功能有很多,但是我们用到的只有很少,具体使用参照下面视频。

首先我们可以采用最无脑的办法,录制脚本:

录制脚本

在视频中我们可以看到,在我们点击开始录制以后,对想要操作的控件进行操作,操作结束后就可以在录制窗口看到操作对应脚本代码,将代码进行复制即可。

1
2
3
4
5
MobileElement el1 = (MobileElement) driver.findElementByXPath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.RelativeLayout[2]/android.widget.ListView/android.support.v7.widget.RecyclerView[1]/android.widget.LinearLayout[1]");
el1.click();
MobileElement el2 = (MobileElement) driver.findElementByXPath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.support.v4.view.ViewPager/android.widget.FrameLayout/android.widget.RelativeLayout/android.support.v7.widget.RecyclerView/android.widget.LinearLayout[2]/android.support.v4.view.ViewPager/android.widget.LinearLayout/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.ImageView");
el2.click();

这是直接从录制脚本中得到的代码,由于这里引用了MobileElement这个类,初始文件中没有引入,所以如果直接将代码复制到Eclispe中运行,编译器是会报错的,解决办法有两种:

  1. 在文件中引入对应的库
  2. 将代码稍作修改,修改如下:
1
2
driver.findElementByXPath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.RelativeLayout[2]/android.widget.ListView/android.support.v7.widget.RecyclerView[1]/android.widget.LinearLayout[1]").click();
driver.findElementByXPath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.support.v4.view.ViewPager/android.widget.FrameLayout/android.widget.RelativeLayout/android.support.v7.widget.RecyclerView/android.widget.LinearLayout[2]/android.support.v4.view.ViewPager/android.widget.LinearLayout/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.ImageView").click();

修改后的代码是可以进行运行的。

观察代码我们可以看到driver.findElementByXPath(),通过字面意思,通过Xpath找到元素,而括号内的内容即为Xpath,这是一种特殊的路径(类似于文件路径可以定位到文件)可以定位到目标控件。

image.png

我们观察Appium中的源窗口也可以看到,其中显示的内容也类似于树状的文件路径。通过录制功能得到的路径就是从最外层一直延申到目标控件的绝对路径。

也因此完全依赖录制脚本这种做法是不推荐的,因为,大家可以看到此时的Xpath是完全没有技巧可言的,这种包含这种路径的代码执行起来效率与准确率也很低。

比较推荐的做法参照下面的视频:

灵活定位

我们可以看到,在我们单击一个控件后就可以在右侧看到他的很多属性,诸如:id、text等等,比较推荐的是使用这两个属性进行定位,因为这两个属性一般很少重复,单凭这两个属性进行定位,准确率和效率都可以得到保证。

  • 使用id进行定位的语句为:
1
2
driver.findElementById()
# 括号内填写控件id
  • 使用text进行定位的语句为
1
2
driver.findElementByXPath("//android.widget.TextView[@text='xxxxxxxxxxx']")
# xxxxxxxxx替换为控件text即可。

定位时还需注意的一点是,控件都含有一个clickable属性,这个属性为true时说明控件可以点击,反之说明此时定位到的元素不能点击,可能定位出错。

3.代码编写

使用插件下载代码模板
image.png

apk文件夹中存放的是APP的安装文件,src文件夹中存放的是源程序的模板,注意源程序模板的这两行内容
image.png

再注意Appium配置Json的这两个参数的内容

5cd439a473b60.png

所以可以使用插件先下载代码,使用apk文件夹中的APP安装程序将带测程序安装至模拟器中。从src文件夹中的源程序模板中获取appPackageappActivity参数,填写至Appium的Json中启动服务,按照上文所述步骤获取控件相关信息编写代码,运行。


  • 滑动

有时会出现需要滑动屏幕的情况,滑动屏幕是通过确定滑动起始点与滑动终止点实现的,但点位的坐标情况与手机屏幕的比例有关,需要灵活确定。

1
2
3
4
5
6
int width = driver.manage().window().getSize().width;  
# 屏幕宽
int height = driver.manage().window().getSize().height;
# 屏幕长
driver.swipe(begin_width, begin_height, end_width,end_height , time);
# 滑动起始点终止点,滑动时间
  • 输入

1
2
3
driver.findElementById( ).sendKeys();

driver.findElementByXpath( ).sendKeys();
  • 后退

1
2
3
driver.sendKeyEvent(AndroidKeyCode.BACK);

driver.navigate().back();

4. Other

  • 定位控件的方式优先使用id、text等方式,尽量避免使用xpath定位
  • 定位时注意控件的clickable属性
  • 注意本赛项编码所需时间较长,但试题难度不大,需要注意比赛的时间分配,可以先编写简单部分得分
  • 将代码整体运行一次的时间较长,所以到比赛的末期尽量不要修改代码,防止最后一次代码提交不上,影响成绩

5.往届试题

移动应用测试往届试题

移动应用测试答案

开发者测试


全国大学生软件测试大赛赛后总结
https://siegelion.cn/2020/08/13/全国大学生软件测试大赛赛后总结/
作者
siegelion
发布于
2020年8月13日
许可协议