zoukankan      html  css  js  c++  java
  • TDD示例

    参考文档:
    码农翻身-从零开始造Spring 中的《介绍TDD开发方式, 重构的方法》

    TDD的流程是:
    写一个测试用例->运行:失败->写Just enough的代码,让测试通过->重构代码保持测试通过,然后循环往复。

    下面,我们通过一个简单的例子来说明TDD的流程

    需求:写一个方法,返回小于给定值max的所有素数组成的数组

    public static int[] getPrimes(int max);
    

    先做一个简单的任务分解

    • 边界条件:getPrimes(0) getPrimes(-1) getPrimes(2)应该返回什么?
    • 正常输入:getPrimes(9) getPrimes(17) getPrimes(30)

    首先,要创建一个测试类
    PrimeTest

    import org.junit.Assert;
    import org.junit.Test;
    
    public class PrimeUtilTest {
    
        @Test
        public void getPrimes() {
            int[] expected = new int[]{};
            Assert.assertArrayEquals(expected, PrimeUtil.getPrimes(0));
            Assert.assertArrayEquals(expected, PrimeUtil.getPrimes(-1));
            Assert.assertArrayEquals(expected, PrimeUtil.getPrimes(2));
        }
    }
    

    运行这个测试用例,显示测试失败:
    image.png
    然后实现刚好满足需求的这部分代码

    public class PrimeUtil {
    
        public static int[] getPrimes(int max) {
            if (max == 0 || max == -1 || max == 2) {
                return new int[]{};
            }
            return null;
        }
    }
    

    重新运行测试用例,测试通过
    image.png

    然后增加测试方法

     @Test
        public void getPrimes2() {
            Assert.assertArrayEquals(new int[]{2, 3, 5, 7}, PrimeUtil.getPrimes(9));
            Assert.assertArrayEquals(new int[]{2, 3, 5, 7, 11, 13}, PrimeUtil.getPrimes(17));
            Assert.assertArrayEquals(new int[]{2, 3, 5, 7, 11, 13, 17, 19, 23, 29}, PrimeUtil.getPrimes(30));
        }
    

    运行这个测试,报错
    image.png
    然后再实现满足这个测试用例的方法

    public class PrimeUtil {
    
        public static int[] getPrimes(int max) {
            if (max <= 2) {
                return new int[]{};
            }
            int[] newArray = new int[max];
            int size = 0, k= 0;
            for (int i = 2  ; i < max; i++) {
                for ( k = 2  ; k < i/2+1; k++) {
                    if(i%k ==0) {
                        break;
                    }
                }
                if (k == i / 2+1){
                    newArray[size++] = i;
                }
            }
            newArray = Arrays.copyOf(newArray,size);
            return newArray;
        }
    }
    

    再次运行单元测试,测试通过
    image.png
    最后,重构getPrimes方法

    public static int[] getPrimes(int max) {
            if (max <= 2) {
                return new int[]{};
            }
            int[] primes = new int[max];
            int count = 0, j = 0;
            for (int num = 2; num < max; num++) {
                if (isPrime(num)) {
                    primes[count++] = num;
                }
            }
            primes = Arrays.copyOf(primes, count);
            return primes;
        }
    
        private static boolean isPrime(int num) {
            int i ;
            for (i = 2; i < num / 2 + 1; i++) {
                if (num % i == 0) {
                    return false;
                }
            }
            if (i == num / 2 + 1) {
                return true;
            }
            return false;
        }
    

    重新运行单元测试,测试通过
    image.png

    源码:
    Github
    Gitee

  • 相关阅读:
    vmware centos .net core sdk开发测试
    Unable to bind to http://localhost:8080 on the IPv6 loopback interface: 'Cannot assign requested address'.
    把bootstrap4 dropdown 的导航下拉菜单触发方式改为鼠标浮动触发
    vs项目同步到gitee方法
    PetaPoco轻量级ORM框架
    本田汽车车机大屏破解教程
    SqlServer 游标逐行更新数据,根据上一行的数据来更新当前行
    Angular 2/4/5+ 重复点击菜单刷新界面
    Ionic 2 + 手动搭建开发环境教程 【转】
    在过去五分钟内,TypeScript语言服务以外终止了5次
  • 原文地址:https://www.cnblogs.com/greyzeng/p/13337183.html
Copyright © 2011-2022 走看看