Java前后端分离开发使用TDD方式带示例

  1. 传统方式得痛点
    使用传统方式开发人员拿到需求进行构思然后coding,有得时候开发得时候就会发现某些问题无法解决不得不推翻想法从头来过,当解决了一切,项目看似正常运行了,一般开发人员都不会想着把功能进行测试一次。
    如果是前后台分离的项目,缺点更加明显,前台没法进行模拟接口,只能编写静态页面,等待后台接口编写完成再进行调整,往往这个过程是相当漫长的。
  2. 使用TDD(测试驱动开发)模式,可以在整理需求的时候将接口、测试类编写完成,所有的测试都要独立,并且速度要快,也就意味着测试中严禁有使用spring框架进行bean的加载,可以使用mock进行模拟,这个时候的测试类全部都是失败,我们就是需要编写实现代码将测试类全部跑通,然后进行代码优化,这样做的好处是1.前端可以根据预先定义好的接口说明进行模拟开发,后期接入真实接口使调试过程大大降低,2.后台代码质量提高,开发人员需将所有测试类跑通才能进行git提交。
    使用TDD模式需要转变的观念有,前台使用的数据结构为VO而不是传统方式的DBO,service层可能会有大部分set,这个可以通过部分设计模式减轻该情况。
  3. java端开发过程中使用junit的测试示例
    3.1.引入依赖
       <properties>
       	<moke.version>2.11.0</moke.version>
       	<junit.version>4.12</junit.version>
       </properties>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
             <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jmock</groupId>
            <artifactId>jmock</artifactId>
            <version>${moke.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jmock</groupId>
            <artifactId>jmock-legacy</artifactId>
            <version>${moke.version}</version>
            <scope>test</scope>
        </dependency>

3.2.dbo

@Data
public class Student {
    private String id;
    private String name;
    private String sex;
    private Integer age;
}

3.3.vo

@Data
public class StudentInfo {
    private String name;
    private String sex;
    private Integer age;
}

3.4.repository

@Repository
public class StudentRepository {
    public int add(Student student){
        return 0;
    }
}

3.5.service

@Service
public class StudentService {
    private StudentRepository studentRepository;
    public StudentService(StudentRepository studentRepository){
        this.studentRepository = studentRepository;
    }
    public String addStudent(StudentInfo studentInfo){
        Student student = PropertyPadding.change(studentInfo, Student.class);
        int num = studentRepository.add(student);
        if(num > 0){
            return "ok";
        }else {
            return "error";
        }
    }
}

3.6.属性绑定工具类

public class PropertyPadding{
    public static<T> T change(Object object, Class<T> tClass)  {
        Class classA = object.getClass();
        T classB = null;
        try {
            classB = tClass.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        //此处省略将classA属性数据绑定到classB属性过程
        return classB;
    }
}

3.7.测试类 所有的测试方法都得是test开头的,方便后面的集中测试

@RunWith(JUnit4.class)
public class StudentServiceTest extends TestCase {
    private StudentRepository studentRepository;
    private StudentInfo studentInfo;
    private StudentService studentService;

    @Before
    public void init(){
        studentInfo = new StudentInfo();
        final Student student = PropertyPadding.change(studentInfo, Student.class);
        Mockery mockery = new Mockery();
        studentRepository = mockery.mock(StudentRepository.class);
        mockery.checking(new Expectations(){
            {
                exactly(1).of(studentRepository).add(student);
                will(returnValue(1));
            }
        });
        studentService = new StudentService(studentRepository);
    }
    @Test
    public void testAddStudent(){
        studentService.addStudent(studentInfo);
    }
}
  1. 前端使用mocke模拟接口数据的示例
    1.安装mockjs, npm install mockjs --save-dev
    2.配置
    config目录下dev.env.js

    ‘use strict’
    const merge = require(‘webpack-merge’)
    const prodEnv = require(’./prod.env’)

    module.exports = merge(prodEnv, {
    NODE_ENV: ‘“development”’,
    Mock: true
    })
    config目录下prod.env.js

    ‘use strict’
    module.exports = {
    NODE_ENV: ‘“production”’,
    Mock: false
    }
    src目录下main.js添加
    process.env.Mock && require(’./mock/mock.js’)
    在src目录下创建mock目录,这个下面保存mock数据
    可以举一个例子

const Mock = require('mockjs')
 // 获取 mock.Random 对象
 const Random = Mock.Random
 // mock一组数据
 const produceNewsData = function () {
  let articles = []
  for (let i = 0; i < 100; i++) {
    let newArticleObject = {
      title: Random.csentence(5, 30), //  Random.csentence( min, max )
      thumbnail_pic_s: Random.dataImage('300x250', 'mock的图片'), // Random.dataImage( size, text ) 生成一段随机的 Base64 图片编码
      author_name: Random.cname(), // Random.cname() 随机生成一个常见的中文姓名
      date: Random.date() + ' ' + Random.time() // Random.date()指示生成的日期字符串的格式,默认为yyyy-MM-dd;Random.time() 返回一个随机的时间字符串
    }
    articles.push(newArticleObject)
  }
  return {
    data: articles
  }
 }
 // 拦截ajax请求,配置mock的数据
 Mock.mock('/api/test', 'get', produceNewsData)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
测试驱动的编程是 XP 困扰程序员的一个方面。对于测试驱动的编程意味着什么以及如何去做,大多数人都做出了不正确的假设。这个月,XP 方面的讲师兼 Java 开发人员 Roy Miller 谈论了测试驱动的编程是什么,它为什么可以使程序员的生产力和质量发生巨大变化,以及编写测试的原理。请在与本文相随的 论坛提出您就本文的想法,以飨笔者和其他读者。(您也可以单击本文顶部或底部的“讨论”来访问该论坛。) 最近 50 年来,测试一直被视为项目结束时要做的事。当然,可以在项目进行之结合测试,测试通常并不是在 所有编码工作结束后才开始,而是一般在稍后阶段进行测试。然而,XP 的提倡者建议完全逆转这个模型。作为一名程序员,应该在编写代码 之前编写测试,然后只编写足以让测试通过的代码即可。这样做将有助于使您的系统尽可能的简单。 先编写测试 XP 涉及两种测试: 程序员测试和 客户测试。测试驱动的编程(也称为 测试为先编程)最常指第一种测试,至少我使用这个术语时是这样。测试驱动的编程是让 程序员测试(即单元测试 ― 重申一下,只是换用一个术语)决定您所编写的代码。这意味着您必须在编写代码之前进行测试。测试指出您 需要编写的代码,从而也 决定了您要编写的代码。您只需编写足够通过测试的代码即可 ― 不用多,也不用少。XP 规则很简单:如果不进行程序员测试,则您不知道要编写什么代码,所以您不会去编写任何代码。 测试驱动开发(TDD)是极限编程的重要特点,它以不断的测试推动代码的开发,既简化了代码,又保证了软件质量。本文从开发人员使用的角度,介绍了 TDD 优势、原理、过程、原则、测试技术、Tips 等方面。 背景 一个高效的软件开发过程对软件开发人员来说是至关重要的,决定着开发是痛苦的挣扎,还是不断进步的喜悦。国人对软件蓝领的不屑,对繁琐冗长的传统开发过程的不耐,使大多数开发人员无所适从。最近兴起的一些软件开发过程相关的技术,提供一些比较高效、实用的软件过程开发方法。其比较基础、关键的一个技术就是测试驱动开发(Test-Driven Development)。虽然TDD光大于极限编程,但测试驱动开发完全可以单独应用。下面就从开发人员使用的角度进行介绍,使开发人员用最少的代价尽快理解、掌握、应用这种技术。下面分优势,原理,过程,原则,测试技术,Tips等方面进行讨论。 1. 优势 TDD的基本思路就是通过测试来推动整个开发的进行。而测试驱动开发技术并不只是单纯的测试工作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值