【Junit Experiment】Junit 软件质量测试实验--日期格式规范性+字符串格式规范性

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,5000CU*H 3个月
简介: 软件质量与测试之Junit对Java代码进行测试实战

 测试方法

       使用Junit和 @Test、@Before、@After、@BeforeClass、@AfterClass用法,并结合黑盒测试方法进行程序测试。

实战题目

       1.实现函数String NewDivision(String innumber),输入一个字符串包含两个数字,用逗号分隔,例如“123,234”,“11.1,2”。对字符串进行解析,返回两个数相除结果。输入数字可以是整数或者小数,并且程序可以对非法输入进行处理和识别,例如输入一个数,没有逗号,输入非数字等。

       2.编写函数,RightDate(String date),date表示日期,包含年月日(个位数月份前加0,如,4月->04),例如“19870411”、“20201211”。RightDate函数用来判别输入日期是否正确,合法输入年份范围[1987,2021]。假定被调试的程序能接受一切符合规定的日期,拒绝所有不符合规定的日期。

题目分析

       对于问题1,需要从字符串的长短和内容进行判断,字符串长短较为容易,而字符串内容可根据题目特点来,即该字符串最大特点为以逗号分隔两个数字,先解决数字问题,数字可分小数或者整数,可用正则表达式进行判断,再解决逗号问题,直接判断字符串中逗号的个数比较der,可通过split(",")后字符串的个数以及字符串的内容是否为null进行解决。最后,从业务要求分析,该题为除法运算,自然还有除数为零这个问题。

       对于问题2,延续第一题的分析方法,从字符串的长短和内容进行判断。内容方面,首先是字符方面,该字符串应当全是整数,用正则较为方便,其次该题是日期,分为年、月、日。将这三者进行排列组合逐步排查,单个排查,自然是从时间范围,双个排查,月和日有着31天的问题,三个排查,有着闰年二月二十九日问题。

代码模块

第一题

package JunitTest1;
import java.util.regex.Pattern;
//1. 实现函数String NewDivision(String innumber),
//        输入一个字符串包含两个数字,用逗号分隔,例如“123,234”,“11.1,2”。对字符串进行解析,
//        返回两个数相除结果。输入数字可以是整数或者小数,
//        并且程序可以对非法输入进行处理和识别,
//        例如输入一个数,没有逗号,输入非数字等。
public class NewDivision {
    public String division(String s){
        Pattern pattern1 = Pattern.compile("^[-\\+]?[\\d]*$");
        Pattern pattern2 = Pattern.compile("^[-\\+]?\\d*[.]\\d+$");
        String f[]=s.split(",");
        if(f.length!=2){return "字符输入错误";}
        if (f[0]==null||"".equals(f[0])||f[1]==null||"".equals(f[1]))
        {
            return "字符输入错误";
        }
        if(!((pattern1.matcher(f[0]).matches()||pattern2.matcher(f[1]).matches())&&
                (pattern1.matcher(f[1]).matches()||pattern2.matcher(f[1]).matches())))
        {
            return "字符输入错误";
        }
        double d1=Double.parseDouble(f[0]);
        double d2=Double.parseDouble(f[1]);
        System.out.println(d2);
        if(d2==0.0||d2==0){return "除数为零";}
        return String.valueOf(d1/d2);
    }
}

image.gif

package JunitTest1;
import static org.junit.Assert.*;
import org.junit.*;
public class TestNewDivision {
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        System.out.println("this is beforeclass");
    }
    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        System.out.println("this is afterclass");
    }
    @Before
    public void setUp() throws Exception {
        System.out.println("this is before");
    }
    @After
    public void tearDown() throws Exception {
        System.out.println("this is after");
    }
    @Test
    public void testdivision1() {
        assertEquals("字符输入错误", new NewDivision().division("256"));
        System.out.println("测试成功!");
    }
    @Test
    public void testdivision2() {
        assertEquals("字符输入错误", new NewDivision().division("854,"));
        System.out.println("测试成功!");
    }
    @Test
    public void testdivision3() {
        assertEquals("字符输入错误", new NewDivision().division(",458.5"));
        System.out.println("测试成功!");
    }
    @Test
    public void testdivision4() {
        assertEquals("字符输入错误", new NewDivision().division("452.4,451,42"));
        System.out.println("测试成功!");
    }
    @Test
    public void testdivision5() {
        assertEquals("字符输入错误", new NewDivision().division("452.4,452.0.0"));
        System.out.println("测试成功!");
    }
    @Test
    public void testdivision6() {
        assertEquals("除数为零", new NewDivision().division("2.0,0.0"));
        System.out.println("测试成功!");
    }
    @Test
    public void testdivision7() {
        assertEquals("0.0", new NewDivision().division("0,885.5"));
        System.out.println("测试成功!");
    }
}

image.gif

第二题

package JunitTest1;
import java.util.regex.Pattern;
//2. 编写函数,RightDate(String date),date表示日期,
//        包含年月日(个位数月份前加0,如,4月->04),
//        例如“19870411”、“20201211”。
//        RightDate函数用来判别输入日期是否正确,合法输入年份范围[1987,2021]。
//        假定被调试的程序能接受一切符合规定的日期,拒绝所有不符合规定的日期。
public class RightDate {
    public boolean runnian(int x){
        if ((x%4==0 && x%100!=0)||(x%400==0))
            return true;
        else
            return false;
    }
    public String rightDate(String s){
        Pattern pattern = Pattern.compile("[0-9]*");
        if(s.length()!=8||(!pattern.matcher(s).matches())){
            return "日期格式不规范--请检查日期符号";
        }
        int year=Integer.parseInt(s.substring(0,4));
        int month=Integer.parseInt(s.substring(4,6));
        int day=Integer.parseInt(s.substring(6,8));
        if(year<1987||year>2020)
        {
            return "日期格式不规范--请检查年范围";
        }
        if (month>12||month==0){
            return "日期格式不规范--请检查月范围";
        }
        if ((day>=31||day==0)||((month==4||month==6||month==9||month==11)&&(day==31))){
            return "日期格式不规范--请检查日范围";
        }
        if(month==2&&day==29&&(!runnian(year))){
            return "日期格式不规范--请检查是否是闰年";}
        return "日期规范!";
    }
    public static void main(String argc[]){
        RightDate r1=new RightDate();
        System.out.println("20201310".substring(0,4));
        System.out.println(r1.rightDate("20201310"));
    }
}

image.gif

package JunitTest1;
import static org.junit.Assert.*;
import org.junit.*;
public class TestRigthDate {
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        System.out.println("this is beforeclass");
    }
    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        System.out.println("this is afterclass");
    }
    @Before
    public void setUp() throws Exception {
        System.out.println("this is before");
    }
    @After
    public void tearDown() throws Exception {
        System.out.println("this is after");
    }
    @Test
    public void testrightDay1() {
        assertEquals("日期格式不规范--请检查日期符号",new RightDate().rightDate("202012120000000"));
        System.out.println("测试成功!");
    }
    @Test
    public void testrightDay2() {
        assertEquals("日期格式不规范--请检查年范围",new RightDate().rightDate("20211210"));
        System.out.println("测试成功!");
    }
    @Test
    public void testrightDay3() {
        assertEquals("日期格式不规范--请检查月范围",new RightDate().rightDate("20201310"));
        System.out.println("测试成功!");
    }
    @Test
    public void testrightDay4() {
        assertEquals("日期格式不规范--请检查月范围",new RightDate().rightDate("20201431"));
        System.out.println("测试成功!");
    }
    @Test
    public void testrightDay5() {
        assertEquals("日期格式不规范--请检查日范围",new RightDate().rightDate("20200432"));
        System.out.println("测试成功!");
    }
    @Test
    public void testrightDay6() {
        assertEquals("日期格式不规范--请检查是否是闰年",new RightDate().rightDate("19950229"));
        System.out.println("测试成功!");
    }
    @Test
    public void testrightDay7() {
        assertEquals("日期格式不规范--请检查日期符号",new RightDate().rightDate("2020****"));
        System.out.println("测试成功!");
    }
    @Test
    public void testrightDay8() {
        assertEquals("日期规范!",new RightDate().rightDate("20201212"));
        System.out.println("测试成功!");
    }
}

image.gif

测试结果

image.gif编辑

image.gif编辑

目录
相关文章
|
1月前
|
消息中间件 测试技术
项目环境测试问题之规范执行器的异常处理如何解决
项目环境测试问题之规范执行器的异常处理如何解决
|
1月前
|
XML Java 测试技术
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
这篇文章介绍了Spring5框架的三个新特性:支持@Nullable注解以明确方法返回、参数和属性值可以为空;引入函数式风格的GenericApplicationContext进行对象注册和管理;以及如何整合JUnit5进行单元测试,同时讨论了JUnit4与JUnit5的整合方法,并提出了关于配置文件加载的疑问。
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
|
7天前
|
测试技术 程序员
关于字符串为空的几个性能测试
本文通过实验对比了两种字符串赋值方式(`string str=&quot;&quot;;` 和 `string str=string.Empty;`)及五种判断字符串是否为空的方法的性能差异。实验结果显示,使用 `string.Empty` 的赋值方式性能更优,且在判断字符串是否为空时,`.Length==0` 方法最为高效,其次是 `str.Equals(&quot;&quot;)` 和 `str==string.Empty` 等方法。文章提供了详细的测试代码和结果分析。
14 3
关于字符串为空的几个性能测试
|
6天前
|
SQL JavaScript 前端开发
基于Java访问Hive的JUnit5测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Java、来开发Hive应用的方法,产生的代码如下
25 6
|
22天前
|
NoSQL Linux Android开发
内核实验(三):编写简单Linux内核模块,使用Qemu加载ko做测试
本文介绍了如何在QEMU中挂载虚拟分区、创建和编译简单的Linux内核模块,并在QEMU虚拟机中加载和测试这些内核模块,包括创建虚拟分区、编写内核模块代码、编译、部署以及在QEMU中的加载和测试过程。
81 0
内核实验(三):编写简单Linux内核模块,使用Qemu加载ko做测试
|
29天前
|
测试技术
单元测试问题之使用TestMe时利用JUnit 5的参数化测试特性如何解决
单元测试问题之使用TestMe时利用JUnit 5的参数化测试特性如何解决
21 2
|
29天前
|
Java 测试技术 Maven
单元测试问题之在Maven项目中引入JUnit 5和Mockito的依赖如何解决
单元测试问题之在Maven项目中引入JUnit 5和Mockito的依赖如何解决
89 1
|
1月前
|
测试技术 持续交付
探索式测试:一种灵活的软件质量保证方法
在软件测试领域,探索式测试是一种与传统脚本测试截然不同的方法。它强调测试人员的自主性与创造性,允许他们在执行测试时即时设计和执行测试用例。这种方法的灵活性和适应性使其成为发现复杂软件系统中难以预测的错误的有效手段。本文将深入探讨探索式测试的核心概念、实施策略以及它在现代软件开发生命周期中的价值。
44 4
|
28天前
|
测试技术
如何使用 JUnit 测试方法是否存在异常
【8月更文挑战第22天】
14 0
|
2月前
|
敏捷开发 测试技术 持续交付
探索式测试:一种高效软件质量保证方法
在软件开发的复杂性不断增加的背景下,传统的测试方法已不能完全满足快速迭代和高质量标准的要求。探索式测试(Exploratory Testing)作为一种灵活且高效的软件测试实践,正逐渐成为质量保证过程中不可或缺的一部分。本文将深入探讨探索式测试的核心理念、实施策略以及与传统测试方法相比的优势,旨在为读者提供一套完整的探索式测试框架及其在实际项目中的应用示例。