重返大二之从零入行《软件测试》备战技能大赛

591 阅读14分钟

特别声明:本文部分内容纯属虚构,如有雷同回来点赞。


想一万次不如行动一次

叙事背景: 2044年AI之下,人类保留了10种职业:一种是指导AI工作,另一种是
被AI指导工作。

你说话,人工智能可以做任何事。
You Speak, AI Do Anything!
中文超越英文成为世界第一通用人工智能交流语言。

图片.png

2044年,主人公小A已经40岁。经历了太多他仍然认为20年前2024是最好的时代。
如果再让他回到20岁让他多掌握一点驾驭计算机的能力,就不会如今天这般落魄... 时代的眼泪模糊了他的双眼。
“没为学习流过泪,一谈恋爱心就碎”——
“学生时代最高级的游戏方式就是编程”——老师曾说过。
如果我能重回校园... ...

2024年3月,大二计算机应用技术专业Web前端方向学生,英语一般有TypeScript编程基础,为避开专升本考试, 从零走上备战职业院校技能大赛《软件测试》,目标是省一等奖。

Java没用过、Python没学过,PostMan...。上来就是6小时,双人团队赛。
21天你不可能精通XX编程...
但如果非要做这件事,那么只能, 隔山打牛,孤注一掷,背水一战,迎难而上
一个月两个人,创造一个脚踏实地的奇迹。

图片.png

《2024专升本 改革》其中
4.技能大赛免试考生。包括在专科高等职业教育期间,且在本通知印发前符合以下条件之一的学生:
*世界技能大赛参赛选手(含入围国家集训队选手)
*中华人民共和国职业技能大赛 优胜奖及以上
*全国职业院校技能大赛 三等奖及以上
*湖北省职业院校技能大赛 一等奖

图片.png

S1.文档搜集整理能力

0.目标结构

图片.png

1.下载赛项规程+赛题

打开此网页点击这里跳转

图片.png

图片.png

2.学习通下载赛项指南、需求说明书等

学习通资料w4下载以下3个文件。目前文件夹目录结构为:

图片.png

3.填写报名表,准备照片

打开《报名表.xls》 ,根据真实信息填写下表。
图片.png

另外需准备一张一寸电子照片。
295px x 413px

bc400181b99d64e2e87030f3012d18929117.png






图片.png

S2. 系统界面

1.角色功能

图片.png

企业资源规划(Enterprise Resource Planning, ERP)系统中,通常包含:
1.供应链管理(Supply Chain Management, SCM)
2.库存管理(Inventory Management)
3.采购管理(Procurement Management
4.销售管理(Sales Management)
5.财务管理(Financial Management)
等多个模块的综合性ERP系统。

  1. 系统管理员 - 负责整个系统的设置、权限分配以及基础信息的管理,如商品信息、仓库信息、客户信息和供应商信息等。
  • 商品信息管理:

    • 商品管理:维护商品的基本信息,包括新增、修改、删除商品记录。
    • 商品品牌:管理不同品牌的产品信息。
    • 商品单位:定义和管理商品的计量单位。
    • 商品分类:对商品进行分类管理,便于查询和统计。
  • 仓库信息:维护企业内部仓库的基础信息。

  • 客户信息:录入、编辑和查看客户资料。

  • 供应商信息:管理供应商的详细信息。

  1. 采购主管/采购专员 - 主要关注采购活动的管理,包括商品的采购入库和退货。
  • 采购管理:
    • 采购入库:处理采购订单执行后的实物接收过程,更新库存数量。
    • 采购退货:处理向供应商退回不合格或多余的采购商品。
  1. 仓库主管/仓库专员 - 负责库存的实际操作和管理工作。
  • 库存管理:监控库存总量、查看单个商品库存详情以及进行库存盘点等操作。
  • 库存分布:展示库存分布在不同仓库的具体情况。
  • 出库审核:审批销售出库或其他用途的库存减少操作。
  • 入库审核:审核并确认采购入库及其他来源的商品入库。
  • 库存调拨:在不同仓库之间转移库存资源。
  1. 销售主管/销售专员 - 管理销售订单、商品出库及退货。
  • 销售管理:
    • 销售出库:处理销售订单,执行发货并相应减少库存。
    • 销售退货:处理由客户退回的商品,更新库存并可能涉及到退款或换货流程。
  1. 结算主管/结算专员 - 处理与收入和支出相关的财务结算工作。
  • 结算管理:
    • 收入结算:处理销售收入的到账确认及应收账款管理。
    • 支出结算:管理应付账款,包括供应商付款等支出事项。

通过这样的角色分工和菜单结构,ERP系统可以有效地帮助企业实现跨部门的协同作业,确保从采购、仓储、销售到财务结算等一系列核心业务流程的顺畅运作。

2.核心页面

图片.png

3.ERP界面分析

在线查看ERP系统界面UI

图片.png

S3. 赛题分析

任务1 赛题分析

根据比赛规范公布10套赛题中的第2套,团队两人一组,可以做如下安排。

图片.png

图片.png

图片.png

任务2 单元测试 (10分)

根据软件测试竞赛项目需求,编写应用程序,设计测试数据并得出测试结果,编写单元测试报告。
环境要求(Java相关):

  • Eclipse_Version:2022-03(4.23.0)
  • junit-4.13.2.jar
  • hamcrest-core-1.3.jar
  • hamcrest-library-1.3.jar

以下用TypeScript平行实现。x3

题目1 (2.5分)

任意输入2个正整数值分别存入x、y中,据此完成下述分析:

  1. 若x≤0或y≤0,则提示:“输入不符合要求。”;
  2. 若2值相同,则提示“可以构建圆形或正方形”;
  3. 若2<|x-y|≤5,则提示“可以构建椭圆”;
  4. 若|x-y|>5,则提示“可以构建矩形”;
  5. 若0<|x-y|≤2,提示“可以构建长方形”。

要求:使用TypeScript编写程序代码,构造数据并完成测试

图片.png

//第一步 构建测试数据
let 数据: number[][] = [
   [-1, 0],
   [100, 100],
   [10, 5],
   [20, 7],
   [7, 7],
]

//第二步 构建测试函数
function test(x: number, y: number): string {
   let str: string = ''
   if (x <= 0 && y <= 0) {       //若x≤0或y≤0,则提示:“输入不符合要求。”;
      str = '输入不符合要求'
   } else if (x == y) {       // 若2值相同,则提示“可以构建圆形或正方形”;
      str = '可以构建圆形或正方形'
   } else if (Math.abs(x - y) > 2 && Math.abs(x - y) <= 5) {    // 若2<|x-y|≤5,则提示“可以构建椭圆”;
      str = '可以构建椭圆'
   } else if (Math.abs(x - y) > 5) {   // 若|x-y|>5,则提示“可以构建矩形”;
      str = '可以构建矩形'
   } else if (Math.abs(x - y) > 0 && Math.abs(x - y) <= 2) {   //// 若0<|x-y|≤2,提示“可以构建长方形”。
      str = '可以构建长方形'
   }

   return str
}


题目2(2.5分)

输入一个大写字母一个小写字母。根据输入的第一个字母和周几英文单词的第一个大写字母判断是周几,如果无法根据第一个大写字母判断,则继续根据输入的第二个小写字母进行判断,最终返回正确的英文周几的单词。

图片.png

这题目真是绕口,需求存在模糊的部分。
核心功能:
只输入两个字母,第一个大写字母判断不了就看第二个小写字母。
第一个字母判断正确,就不再输入第二个。
疑惑:1.如果第一个字母不对,是否还执行第二个字母判断
2.如果第一个字母对,第二个字母不对呢

简化,第一个字母必须正确。


要求:使用TypeScript编写程序代码,构造数据并完成测试

const 星期:string[] = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];

//测试用例  Ww 。
// 首字母可以唯一确定的  M周一  W周三  F周五
// 首字母 是     T(二u、四h)   S(六a、七u)  由第二个字母决定

const 数据: [string,string?][] = [
    //正向测试
    // 正确匹配第一个大写字母的情况
    ['M'],  //Monday
    ['W'],  //Wednesday
    ['F'],  //Friday

    //第一个字母正确,但需要匹配第二个字母
    ['T', 'u'],//周二 Tuesday
    ['T', 'h'],//周四 Thursday

    ['S', 'a'],//周六 Saturday   
    ['S', 'u'],//周日 Sunday   

    //反向测试
    //第一个字母不对
    ['M'],
    ['Y'],
    ['Z'],
    //第二个字母不对
    ['T','x'],
    ['S','y'],
]


题目3(2.5分)

进行系统注册时通常需要输入用户名和密码,其中用户名要求由8个字母组成、密码由6个(含6)以上数字组成。满足要求,则提示“注册成功”,否则根据实际情况提示xx不符合要求(xx为用户名或密码)
要求:使用TypeScript编写程序代码,构造数据并完成测试

  • 8个 ——8个以下——超过8个
  • 字母 ——非字母
  • 6个以上 ——小于6个
  • 数字 ——非数字

共有3x 2 x2 x 2= 24种测试覆盖。



题目4 (2.5分)

输入小写的字符串。如字符串前缀为ab开头,则将前缀ab替换为ef并打印出替换后字符串,返回文字“替换前缀后的字符串为:”和替换后字符串值;如后缀为cd并且前缀不为ab,替换字符串中所有cd为gh并打印出替换后字符串,返回文字“替换cd后的字符串为:”和替换后字符串值;否则全部字母大写输出,返回文字“大写字母的字符串为:”和转换后的字符串值。

这句话描述的是一个编程需求,具体步骤如下:

1. 输入一个小写的字符串。
2. 如果输入字符串的前两个字符是 "ab",则将 "ab" 替换为 "ef",并打印出替换后的字符串,同时返回消息 "替换前缀后的字符串为:" 加上替换后的新字符串。
3. 若输入字符串的后两个字符是 "cd",且其前缀不是 "ab",则将字符串中所有的 "cd" 替换为 "gh",打印出替换后的字符串,并返回消息 "替换cd后的字符串为:" 加上替换后的新字符串。
4. 如果既不符合前缀为 "ab" 的条件,也不符合后缀为 "cd" 的条件,则将整个字符串中的所有字母转换为大写,打印出转换后的全大写字符串,并返回消息 "大写字母的字符串为:" 加上转换后的新字符串。

举例说明:

- 输入 "abcdecd",输出应为:替换前缀后的字符串为: efcdecdf
- 输入 "xyzabcd",输出应为:替换cd后的字符串为: xyzabgh
- 输入 "hello",输出应为:大写字母的字符串为: HELLO


要求:使用TypeScript编写程序代码,构造数据并完成测试


任务3 测试文档(10分)

图片.png

测试用例设计方法

任务4 功能测试(25分)

图片.png

图片.png

任务5 自动化测试 (20分)

根据题目要求编写并执行自动化测试脚本,考 查浏览器基本操作、页面元素进行识别并定位、 Selenium 基本方法使用、Unittest 框架、数据驱 动、数据断言、测试报告、Page Object 设计模 式等,最终编写自动化测试报告。Python语言

  • python-3.10.6-amd64
  • pycharm-community-2022.2.1
  • selenium(4.4.3)
  • ddt(1.6.0)

题目1 (3分)

构建拟真页面test.html 因为买不起价值几十万的平台,所以根据页面功能写一个类似的HTML页面,丢到服务器上

图片.png

题目2 (4分)

  1. 搭建UnitTest框架 (Py单元测试框架);
  2. 引入By方法类;
  3. 定义setUp方法启动浏览器,增加3秒的智能等待,将浏览器窗口最大化;
  4. 定义tearDown方法关闭浏览器;
  5. 定义test_denglu01方法进入系统登录页面,通过ID方法定位用户名和密码输入框并输入账号和密码(XTGLY/123456),通过CLASS方法定位并点击登录按钮,最后增加一秒的强制等待;
  6. 定义test_denglu02方法进入系统登录页面,通过NAME方法定位用户名和密码输入框并输入账号和密码(XTGLY/123456),通过CLASS_NAME方法点击登录按钮,最后增加一秒的强制等待,通过LINK_TEXT方法定位并点击“仓库信息”按钮;
  7. 通过unittest.main()方法执行测试用例。

题目3 (5分)

测试数据:

商品分类名称预期结果
商品分类名称必填,请重新输入。

步骤1:新建csv格式的测试数据testdata.csv,并编写csvv.py脚本读取csv中的测试数据。


import csv

def read_testdata():

    test_data = []
    with open('1.csv', 'r' ) as f:
        csvObj = csv.reader(f,delimiter='\t')
        for row in csvObj:
            test_data.append(row)
    return test_data

步骤2:新建test01.py:

  1. 引入步骤1中的写好的数据读取的方法以及ddt方法类;
  2. 引入By方法类;
  3. 搭建unittest框架;
  4. 在setUp中打开谷歌浏览器,增加5秒的智能时间等待,将浏览器窗口最大化;
  5. 在tearDown中退出浏览器;
  6. 新建测试用例,通过ID属性定位用户名输入框,并输入用户名XTGLY;
  7. 通过NAME属性定位密码输入框,并输入密码123456;
  8. 查看登录页面中的登录按钮元素,通过TAG_NAME方法定位登录按钮,使用click()方法点击登录按钮进入系统首页;
  9. 通过LINK_TEXT方法进行定位,使用click()方法点击“商品分类”按钮;
  10. 通过XPATH方法点击“新增”按钮;
  11. 通过数据驱动输入“商品分类名称”;
  12. 通过XPATH方法定位并点击“保存”按钮;
  13. 通过CLASS_NAME方法定位并获取提示信息文字,通过assertEqual断言方法来验证预期结果和实际结果是否一致,如果不一致进行截图操作;
  14. 通过unittest.main()方法执行测试用例。
import  unittest

import ddt
from selenium import webdriver
from selenium.webdriver.common.by import By

from csvv import read_testdata

# 使用ddt
# print(read_testdata())

@ddt.ddt

class LoginTest(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Chrome()  # 替换为你的ChromeDriver路径
        self.driver.implicitly_wait(5)  # 设置隐性等待3秒
        self.driver.maximize_window()


    @ddt.data(*read_testdata())
    def test_01(self,arr):
        self.driver.get("http://127.0.0.1:5500/py/1.html")  # 替换为你的系统登录页面URL
        self.driver.find_element(By.ID, "username").send_keys("XTGLY")  # 替换为实际的用户名输入框ID
        self.driver.find_element(By.NAME,"password").send_keys("123456")  # 替换为实际的密码输入框ID

        self.driver.find_element(By.TAG_NAME, "button").click()

        self.driver.find_element(By.LINK_TEXT, "商品分类").click()

        self.driver.find_element(By.XPATH, '//*[@id="addBtn"]').click()
        #   11.通过CLASS_NAME方法定位商品分类名称输入框并使用数据驱动输入“商品分类名称”;
        self.driver.find_element(By.CLASS_NAME, "productName").send_keys()

        #   12.通过XPATH方法定位并点击“保存”按钮;
        self.driver.find_element(By.XPATH, '//*[@id="saveBtn"]').click()

        #   13. 通过LINK_TEXT方法定位并获取提示信息文字,通过assertEqual断言方法来验证预期结果和实际结果是否一致,
        # 如果不一致使用get_screenshot_as_file对页面进行截图操作;

        try:

            result = arr[1][1]
            print(arr)
            text = self.driver.find_element(By.LINK_TEXT, "文字提示").get_property('innerHTML')
            self.assertEqual("预期结果", text)
            print("结果一致")
        # assertEquals(text,,"”)
        except AssertionError:
            print("结果不一致")
            self.driver.get_screenshot_as_file('E:/python/test_accept01.png')
        except NoSuchElementException:
            self.fail("无法找到名为'文字提示'的元素")

    def tearDown(self):
        self.driver.quit()


if __name__ == '__main__':
    unittest.main()

题目4 (7分)

图片.png

任务6 性能测试(18分)

根据题目要求录制/添加脚本、设置场景,考察性能测试工具(LoadRunner、JMeter)的脚本录制/添加、检查点、参数化、集合点、关联、事务、场景设置及运行等,最终编写性能测试报告

术语定义描述。	1分
LoadRunner-测试策略。	1分
LoadRunner-性能测试实施过程。	7分
LoadRunner-执行结果。	0.5分

JMeter-测试策略。	1分
JMeter-性能测试实施过程。	7分
JMeter-执行结果。	0.5分

任务7 接口测试(7分)

根据题目要求设置请求、验证接口,考察接口测试工具(PostMan)的接口请求设置、参数设置、变量设置、测试断言、数据驱动、添加Cookie 等,最终编写接口测试报告

术语定义描述。	1分
题目1接口测试实施过程执行截图。	2分
题目2接口测试实施过程执行截图。	2分
题目3接口测试实施过程执行截图。	2分

附录

1.中华人民共和国职业技能大赛官网

2.全国职业院校技能大赛官网(旧)

3.全国职业院校技能大赛官网(新)

4.49所专升本院校汇总