《软件测试》实验程序

请添加图片描述

大家好,我是中国码农摘星人。
欢迎分享/收藏/赞/在看!

1 技术栈

1.1 前端

开发工具:WebStorm

框架:Vue 3

Web UI:Element

请求:Axios

路由:Vue Router

1.2 后端

JDK 1.8

开发工具:IDEA

框架: SpringBoot 2.x

1.3 测试

测试工具:Postman

2 项目简介

2.1 项目架构

前后端分离

结构

.
├── software-testing-web // 前端项目
├── software-testing-springboot // 后台项目
   ├── src
       ├── main
          ├── java
          │   └── com
          │       └── hyd
          │           └── softwaretesting
          │               ├── SoftwareTestingApplication.java
          │               ├── config
          │               │   └── CorsConfig.java
          │               ├── controller
          │               │   ├── CheckTelController.java
          │               │   ├── NextDateController.java
          │               │   └── TriangleController.java
          │               └── util
          │                   ├── JacksonUtil.java
          │                   └── ResponseUtil.java
          └── resources
              ├── application.yml
              └── banner.txt

截屏2021-10-23 上午12.04.46

2.2 实现功能

2.2.1 三角形问题
模块需求

规定输入三个整数a、b、c分别作为三边的边长构成三角形。
通过程序判定所构成的三角形的类型(等边三角形、等腰三角形、一般三角形、构不成三角形),并在屏幕上输出。

测试用例
模拟等价abc输出
输入空值null11请输入三角形的边长!
0值000您输入的值无效!
输入值小于1的整数-1-1-1您输入的值无效!
输入值为小数1.11.11.1您输入的值无效!
输入值为1111等边三角形
输入值为200200200200等边三角形
输入值为201201201201您输入的值无效!
输入值为字符aaa您输入的值无效!
输入值构成一般三角形345一般三角形
输入值构成等腰三角形223等腰三角形
输入值不构成三角形112构不成三角形
相关代码
@RestController
public class TriangleController {

    /**
     * 三角形问题:
     * 规定输入三个整数a、b、c分别作为三边的边长构成三角形。
     * 通过程序判定所构成的三角形的类型(等边三角形、等腰三角形、一般三角形、构不成三角形),
     * 并在屏幕上输出。
     */
    @PostMapping("/triangle")
    public Object triangle(@RequestBody String body) {
        String a = JacksonUtil.parseString(body, "a");
        String b = JacksonUtil.parseString(body, "b");
        String c = JacksonUtil.parseString(body, "c");
        System.out.println("[a]=" + a + ",[b]=" + b + ",[c]=" + c);

        String pattern = "^([1-9]|[1-9]\\d|1\\d{2}|200)$";
        Pattern patt = Pattern.compile(pattern);
        assert a != null;
        Matcher matA = patt.matcher(a);
        assert b != null;
        Matcher matB = patt.matcher(b);
        assert c != null;
        Matcher matC = patt.matcher(c);

        if (a.isEmpty() || b.isEmpty() || c.isEmpty()) {
            System.out.println("请输入三角形的边长!");
            return ResponseUtil.fail(402, "请输入三角形的边长!");
        } else if (!matA.matches() || !matB.matches() || !matC.matches()) {
            System.out.println("您输入的值无效!");
            return ResponseUtil.fail(402, "您输入的值无效!");
        } else if (Integer.parseInt(a) + Integer.parseInt(b) > Integer.parseInt(c) && Integer.parseInt(b) + Integer.parseInt(c) > Integer.parseInt(a) && Integer.parseInt(a) + Integer.parseInt(c) > Integer.parseInt(b)) {
            if (a.equals(b) && a.equals(c)) {
                System.out.println("等边三角形");
                return ResponseUtil.ok("等边三角形");
            } else if (a.equals(b) || a.equals(c) || b.equals(c)) {
                System.out.println("等腰三角形");
                return ResponseUtil.ok("等腰三角形");
            } else {
                System.out.println("一般三角形");
                return ResponseUtil.ok("一般三角形");
            }

        } else {
            System.out.println("构不成三角形");
            return ResponseUtil.ok("构不成三角形");
        }

    }
}
2.2.2 电话号码有效性检查功能
模块需求

执行电话号码有效性检查功能。
中国的固定电话号码由两部分组成。这两部分的名称和内容分别是:
地区码:以0开头的三位或者四位数字(包括0)。
电话号码:以非0、非1开头的七位或者八位数字。

测试用例
模拟等价rcn输出
输入空值nullnull您输入的电话号码无效!
0值00您输入的电话号码无效!
负值-012-4567890您输入的电话号码无效!
小数值01.2456789.0您输入的电话号码无效!
rc以非0开头的三位有效数字12345678900您输入的电话号码无效!
rc以0开头的二位有效数字0145678900您输入的电话号码无效!
rc以0开头的三位有效数字01245678900您输入的电话号码有效!
rc以0开头的四位有效数字012345678900您输入的电话号码有效!
rc以0开头的五位有效数字0123445678900您输入的电话号码无效!
n以0开头的七位有效数字0120123456您输入的电话号码无效!
n以1开头的七位有效数字0121234567您输入的电话号码无效!
n以非0/非1开头的六位有效数字012234567您输入的电话号码无效!
n以非0/非1开头的七位有效数字0122345678您输入的电话号码有效!
n以非0/非1开头的八位有效数字01223456789您输入的电话号码有效!
n以非0/非1开头的九位有效数字012234567890您输入的电话号码无效!
相关代码
@RestController
public class CheckTelController {

    /**
     * 电话号码有效性检查功能:
     * 执行电话号码有效性检查功能,中国的固定电话号码由两部分组成。这两部分的名称和内容分别是:
     * 地区码(rc):以0开头的三位或者四位数字(包括0)。
     * 电话号码(n):以非0、非1开头的七位或者八位数字。
     */
    @PostMapping("/checktel")
    public Object checkTel(@RequestBody String body) {
        String rc = JacksonUtil.parseString(body, "rc");
        String n = JacksonUtil.parseString(body, "n");
        System.out.println("[rc=]" + rc + ",[n=]" + n);

        String pattRC = "^([0][0-9]{2,3})$";
        String pattN = "^([2-9][0-9]{6,7})$";

        Pattern patRC = Pattern.compile(pattRC);
        Pattern patN = Pattern.compile(pattN);
        assert rc != null;
        Matcher matRC = patRC.matcher(rc);
        assert n != null;
        Matcher matN = patN.matcher(n);

        if (matRC.matches()&&matN.matches()){
            System.out.println("您输入的电话号码有效!");
            return ResponseUtil.ok("您输入的电话号码有效!");
        }else {
            System.out.println("您输入的电话号码无效!");
            return ResponseUtil.fail(402, "您输入的电话号码无效!");
        }


    }
}
2.2.3 日期下一天功能
模块需求

输入三个整数:年、月和日,函数的输出为输入日期后一天的日期。
例如,输入为2021年10月22日,则函数的输出为2021年10月23日,
年满足[1920,2050]。

测试用例
模拟等价yearmonthday输出
空值nullnullnull您输入的日期错误!
0值000您输入的日期错误!
负值-2021-10-22您输入的日期错误!
字符值202a1a2a您输入的日期错误!
年份小于192019191022年份必须在1920-2050之间!
年份大于205020511022年份必须在1920-2050之间!
年份为闰年,月份为2月,日为302008230闰年2月要1-29天!
年份为闰年,月份为2月,日为2920082292008-03-01
年份为平年,月份为2月,日为2820212282021-03-01
年份为平年,月份为2月,日为292021229平年2月要1-28天!
月份为1,日期为3120211312021-02-01
月份为1,日期为322021132该月份天数不对!
月份为3,日期为3120213312021-04-01
月份为3,日期为322021332该月份天数不对!
月份为4,日期为3020214302021-05-01
月份为4,日期为312021431该月份天数不对!
月份为5,日期为3120215312021-06-01
月份为5,日期为322021532该月份天数不对!
月份为6,日期为3020216302021-07-01
月份为6,日期为312021631该月份天数不对!
月份为7,日期为3120217312021-08-01
月份为7,日期为322021732该月份天数不对!
月份为8,日期为3120218312021-09-01
月份为8,日期为322021832该月份天数不对!
月份为9,日期为3020219302021-10-01
月份为9,日期为312021931该月份天数不对!
月份为10,日期为31202110312021-11-01
月份为10,日期为3220211032该月份天数不对!
月份为11,日期为30202111302021-12-01
月份为11,日期为3120211131该月份天数不对!
月份为12,日期为31202112312022-01-01
月份为12,日期为3220211232该月份天数不对!
相关代码
@RestController
public class NextDateController {

    /**
     * 日期下一天:
     * 输入三个整数:month、day和year,函数的输出为输入日期后一天的日期。
     * 例如,输入为2021年10月22日,则函数的输出为2021年10月23日,year满足1920≤year≤2050。
     */
    @PostMapping("/nextdate")
    public Object nextDate(@RequestBody String body) {
        String year = JacksonUtil.parseString(body, "year");
        String month = JacksonUtil.parseString(body, "month");
        String day = JacksonUtil.parseString(body, "day");
        System.out.println("[year]:" + year + ",[month]:" + month + ",[day]:" + day);

        assert year != null;
        assert month != null;
        assert day != null;

        try {
            if (year.isEmpty() || month.isEmpty() || day.isEmpty()
                    || Integer.parseInt(year) <= 0 || Integer.parseInt(month) <= 0 || Integer.parseInt(day) <= 0) {
                System.out.println("您输入的日期错误!");
                return ResponseUtil.fail(402, "您输入的日期错误!");
            }
            if (Integer.parseInt(year)<1920||Integer.parseInt(year)>2050){
                System.out.println("年份必须在1920-2050之间!");
                return ResponseUtil.fail(402, "年份必须在1920-2050之间!");
            }
            if ((Integer.parseInt(month) == 1 && Integer.parseInt(day) > 31) || (Integer.parseInt(month) == 3 && Integer.parseInt(day) > 31)
                    || (Integer.parseInt(month) == 4 && Integer.parseInt(day) > 30) || (Integer.parseInt(month) == 5 && Integer.parseInt(day) > 31)
                    || (Integer.parseInt(month) == 6 && Integer.parseInt(day) > 30) || (Integer.parseInt(month) == 7 && Integer.parseInt(day) > 31)
                    || (Integer.parseInt(month) == 8 && Integer.parseInt(day) > 31) || (Integer.parseInt(month) == 9 && Integer.parseInt(day) > 30)
                    || (Integer.parseInt(month) == 10 && Integer.parseInt(day) > 31) || (Integer.parseInt(month) == 11 && Integer.parseInt(day) > 30)
                    || (Integer.parseInt(month) == 12 && Integer.parseInt(day) > 31)) {
                System.out.println("月份天数不对!");
                return ResponseUtil.fail(402, "月份天数不对!");
            }

            if (Integer.parseInt(month) == 2) {
                if (Integer.parseInt(year) % 4 == 0 && Integer.parseInt(year) % 100 != 0 || Integer.parseInt(year) % 400 == 0) {
                    if (Integer.parseInt(day) < 1 || Integer.parseInt(day) > 29) {
                        System.out.println("闰年2月要1-29天!");
                        return ResponseUtil.fail(402, "闰年2月要1-29天!");
                    } else {
                        return getObject(year, month, day);
                    }

                } else {
                    if (Integer.parseInt(day) < 1 || Integer.parseInt(day) > 28) {
                        System.out.println("平年2月要1-28天!");
                        return ResponseUtil.fail(402, "平年2月要1-28天!");
                    } else {
                        return getObject(year, month, day);
                    }
                }

            }
        } catch (NumberFormatException e) {
            e.printStackTrace();
            return ResponseUtil.fail(402, "您输入的日期错误!");
        }

        return getObject(year, month, day);

    }

    private Object getObject(String year, String month, String day) {
        try {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
            //取控制台输入
            String sDate = year + "-" + month + "-" + day;
            //解析日期
            Date date = simpleDateFormat.parse(sDate);
            Calendar c = Calendar.getInstance();
            c.setTime(date);
            //用Calendar工具类给日期加一天
            c.add(Calendar.DATE, 1);
            System.out.println("[下一天]:" + simpleDateFormat.format(c.getTime()));
            return ResponseUtil.ok(simpleDateFormat.format(c.getTime()));
        } catch (ParseException e) {
            e.printStackTrace();
            System.err.println("不能解析的日期格式");
            return ResponseUtil.fail(402, "您输入的日期错误!");
        }
    }

}

附.常用的正则表达式

一、校验数字的表达式

数字:^[0-9]*$

n位的数字:^\d{n}$

至少n位的数字:^\d{n,}$

m-n位的数字:^\d{m,n}$

零和非零开头的数字:^(0|[1-9][0-9]*)$

非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(\.[0-9]{1,2})?$

带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})$

正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$

有两位小数的正实数:^[0-9]+(\.[0-9]{2})?$

有1~3位小数的正实数:^[0-9]+(\.[0-9]{1,3})?$

非零的正整数:^[1-9]\d$ 或 ^(1-9){1,3}$ 或 ^+?1-9$

非零的负整数:^-1-90-9"$ 或 ^-[1-9]\d$

非负整数:^\d+$ 或 ^[1-9]\d*|0$

非正整数:^-[1-9]\d|0$ 或 ^((-\d+)|(0+))$

非负浮点数:^\d+(.\d+)?$ 或 ^[1-9]\d.\d|0.\d[1-9]\d|0?.0+|0$

非正浮点数:^((-\d+(.\d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]\d.\d|0.\d[1-9]\d))|0?.0+|0$

正浮点数:^[1-9]\d.\d|0.\d[1-9]\d$ 或 ^(([0-9]+.[0-9]1-9)|([0-9]1-9.[0-9]+)|([0-9]1-9))$

负浮点数:^-([1-9]\d.\d|0.\d[1-9]\d)$ 或 ^(-(([0-9]+.[0-9]1-9)|([0-9]1-9.[0-9]+)|([0-9]1-9)))$

浮点数:^(-?\d+)(.\d+)?$ 或 ^-?([1-9]\d.\d|0.\d[1-9]\d|0?.0+|0)$

二、校验字符的表达式

汉字:^[\u4e00-\u9fa5]{0,}$

英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$

长度为3-20的所有字符:^.{3,20}$

由26个英文字母组成的字符串:^[A-Za-z]+$

由26个大写英文字母组成的字符串:^[A-Z]+$

由26个小写英文字母组成的字符串:^[a-z]+$

由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$

由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$

中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$

中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$

可以输入含有^%&',;=?KaTeX parse error: Expected group after '^' at position 9: \"等字符:`[^̲%&',;=?\x22]+`

禁止输入含有~的字符:[^~\x22]+

三、特殊需求表达式

Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?

InternetURL:[a-zA-z]+://\s* 或 ^http://([\w-]+.)+[\w-]+(/[\w-./?%&=]*)?$

手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$

电话号码:("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^((\d{3,4}-)|\d{3.4}-)?\d{7,8}$

国内电话号码:(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}

电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号): ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)

身份证号(15位、18位数字),最后一位是校验位,可能为数字或字符X:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)

帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^a-zA-Z{4,15}$

密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$

强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8-10 之间):^(?=.\d)(?=.[a-z])(?=.[A-Z])[a-zA-Z0-9]{8,10}$

强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在8-10之间):^(?=.\d)(?=.[a-z])(?=.[A-Z]).{8,10}$

日期格式:^\d{4}-\d{1,2}-\d{1,2}

一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$

一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$

钱的输入格式:
有四种钱的表示形式我们可以接受:“10000.00” 和 “10,000.00”, 和没有 “分” 的 “10000” 和 “10,000”:^1-9$

这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|1-9)$

一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?1-9)$

这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧。下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$

必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 “10” 和 “10.2” 是通过的:^[0-9]+(.[0-9]{2})?$

这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$

这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})(.[0-9]{1,2})?$

1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3}))(.[0-9]{1,2})?$

备注:这就是最终结果了,别忘了"+“可以用”"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里。

xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\.x|X[l|L]$

中文字符的正则表达式:[\u4e00-\u9fa5]

双字节字符:\x00-\xff (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))

空白行的正则表达式:\n\s\r (可以用来删除空白行)

HTML标记的正则表达式:<(\S?)>>.?|<.? /> ( 首尾空白字符的正则表达式:^\s|\sKaTeX parse error: Undefined control sequence: \s at position 4: 或(^\̲s̲)|(\s) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)

腾讯QQ号:1-9{4,} (腾讯QQ号从10000开始)

中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)

IPv4地址:((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}

3 项目地址

Gitee - softwaretesting

整理不易,欢迎 StarFork _ ,谢谢~~

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
智能车主控芯片采用STM32F103ZET6,该处理器为32 位ARM Cortex-M3 处理器,工作频率为72MHz,64K SRAM,512K Flash,12 位ADC,12 位DAC,12 通道DMA,11 个多功能定时器,多达13 个通信接口:2 个I2C 接口(支持SMBus/PMBus),5 个USART 接口(支持ISO7816、LIN、IrDA 接口和调制解调控制),3 个SPI 接口,CAN 接口,USB 2.0 全速接口,SDIO 接口。 目录 智能车简介 4 主控芯片简介 4 传感器模块 4 第一章 STM32基础实验 5 实验一 Keil uVision4安装以及软件介绍 6 实验二 LED流水灯基础实验 10 引脚分配 10 实验原理 10 函数简介 11 实验步骤 11 实验三 精确延时(SysTick) 12 引脚分配 12 实验原理 12 函数简介 12 实验步骤 13 实验四 串口打印实验 14 引脚分配 14 实验原理 14 函数简介 14 实验步骤 14 实验五 定时器控制 16 引脚分配 16 实验原理 16 函数简介 17 实验步骤 17 实验六 AD转化实验 18 引脚分配 18 实验原理 18 函数简介 18 实验步骤 18 第二章 智能车实验 20 实验一 液晶显示实验 21 引脚分配 21 实验原理 21 函数简介 22 实验步骤 23 实验二 按键检测实验 24 引脚分配 24 实验原理 24 函数简介 26 实验步骤 26 实验三 电机控制实验 28 引脚分配 28 实验原理 28 函数简介 29 实验步骤 29 实验四 转速检测实验 31 引脚分配 31 实验原理 31 函数简介 31 实验步骤 32 实验五 黑线寻迹实验 33 引脚分配 33 实验原理 33 函数简介 34 实验步骤 34 实验六 电池电量检测实验 36 引脚分配 36 实验原理 36 实验步骤 36 实验七 自动避障实验 37 引脚分配 37 实验原理 37 函数简介 37 实验步骤 37 实验八 RFID卡片读取实验 38 引脚分配 38 实验原理 38 函数简介 38 实验步骤 39 实验九 语音播报实验 40 引脚分配 40 实验原理 40 实验步骤 40 实验十 Zigbee数据传输实验 41 引脚分配 41 实验原理 41 函数简介 43 实验步骤 43

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程洪同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值