java抽象类怎么写单元测试

java抽象类怎么写单元测试,第1张

编写良好的单元测试是一项技术工作,本文介绍了这些优秀的框架,同时还详细介绍了创建优秀的Sping Boot单元测试所需的技术

添加依存关系

org.springframework.boot

spring-boot-starter-test

测试

org.junit.jupiter

日本铁路公司

5.5.2

测试

org.projectlombok

lombok

缺省情况下,spring-boot-starter-test部署了Mockito和AssertJ,但必须自己手动部署Lombok、JUnit5。

请勿使用Spring进行单元测试

请看下面的“单元”测试。 测试RegisterUseCase类的方法。

@ extend with (spring extension.class ) )。

@SpringBootTest

class RegisterUseCaseTest {

@Autowired

私有注册用户访问权限;

@Test

voidsaveduserhasregistrationdate (

useruser=newuser('zaphod ',' [email protected]);

usersaveduser=register use case.register user;

资产that (saved user.getregistrationdate () ).isNotNull );

}

}

运行这个测试类大约花了4.5秒。 这是因为计算机运行空的Spring项目。

但是,好的单体测试必须是毫秒级。 否则,会影响“test/code/test”的工作方式。 这也就是说,是测试驱动开发的思想——TDD。 即使我们不做TDD,如果写测试花了太多时间也会影响开发思路。

其实,上面的测试方法实际运行只需要几毫秒。 剩下的4.5秒全部花在@SpringBootRun上。 因为Spring Boot需要启动整个spring boot APP。

也就是说,我们启动整个APP应用程序,消耗大量资源,只是为了测试一种方法,当我们的APP应用程序越来越大的时候,它需要更长的时间启动。

所以,为什么不在Spring Boot上进行单元扰镇测试呢? 接下来,本文介绍了如何在不使用Spring Boot的情况下进行单元测试。

创建测试类

通常,有以下几种方法可以方便地测试Spring beans :

不要注入

首先,让我们看一个错误的例子:

@Service

公共类注册用户使用情况{

@Autowired

隐私用户repositoryuserrepository;

publicuserregisteruser (用户) {

returnuserrepository.save(user;

}

}

但是,这个类必须在Spring中运行。 因为无法绕过名为UserRepository的实例。 如上所述,必须改变不使用@Autowired注入用户存储库的方式。

知识点:不要注入

写构造函数

看看不使用@Autowired的写山差法吧:

@Service

公共类注册用户使用情况{

私有用户缓唯粗报告库;

publicregisterusecase (用户信息库用户信息库) {

this.user存储库=user存储库;

}

publicuserregisteruser (用户) {

returnuserrepository.save(user;

}

}

此版本使用构造函数部署了UserRepository实例。 在单元测试中,可以这样构建实例。

Spring会自动使用构造函数实例化RegisterUseCase对象。 必须注意的是,在Spring 5之前启用构造函数需要@Autowired注释。

请注意,用户资料档案库字段当前为final。 由此,在APP应用程序的整个生命周期中

将是个常量,这可以避免编码错误,因为我们如果忘记初始化字段,编译的时候就会报错。

减少繁复的代码

1.TCP服务端的程序编写

package test

import java.io.BufferedReader

import java.io.InputStreamReader

import java.net.ServerSocket

import java.net.Socket

public class MyTcp{

private BufferedReader reader

private ServerSocket serverSocket

private Socket socket

/**

* 创建服务端的程序,读取客户端传来的数据

*/

void getserver(){

try {

serverSocket = new ServerSocket(8998) //实例化服务端socket

System.out.println("服务器套接字枯清已经创岩败轿建成功")

while (true) {

System.out.println("等待客户机的连接:")

socket = serverSocket.accept() //实例化socket对象

reader = new BufferedReader(new InputStreamReader(socket.getInputStream())) //实例化BufferReader对象

getClientMessage()

}

} catch (Exception e) {

e.printStackTrace()

}

}

private void getClientMessage() {

try {

while (true) {

System.out.println("客户机传来的信息是:"粗肆+reader.readLine())

}

} catch (Exception e) {

e.printStackTrace()

}

}

public static void main(String[] args) {

MyTcp myTcp = new MyTcp() //创建本类对象

myTcp.getserver()

}

}

2.TCP客户端程序编写

package test

import java.awt.BorderLayout

import java.awt.Container

import java.awt.event.ActionEvent

import java.awt.event.ActionListener

import java.io.PrintWriter

import java.net.Socket

import java.nio.channels.WritableByteChannel

import javax.swing.JFrame

import javax.swing.JScrollPane

import javax.swing.JTextArea

import javax.swing.JTextField

import javax.swing.border.BevelBorder

public class MyTcpClient extends JFrame{

private PrintWriter printWriter

Socket socket

private JTextField jTextField = new JTextField()

private JTextArea jTextArea = new JTextArea()

Container container

/**

* 创建的Tcp客户端程序

*/

public MyTcpClient (String title) {

super(title)

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

container = this.getContentPane()

final JScrollPane jScrollPane = new JScrollPane()

jScrollPane.setBorder(new BevelBorder(BevelBorder.RAISED)) //显示边框

getContentPane().add(jScrollPane,BorderLayout.CENTER)

jScrollPane.setViewportView(jTextArea)

container.add(jTextField,"South") //将文本框放在窗体下面

jTextField.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

printWriter.println(jTextField.getText()) //将文本框的信息写入流(为下面的输出流写入信息做准备)

jTextArea.append(jTextField.getText() + "\n")

jTextArea.setSelectionEnd(jTextArea.getText().length())

jTextField.setText(null)

}

})

}

private void connect() {

jTextArea.append("尝试连接中...\n")

try {

socket = new Socket("127.0.0.1",8998)

printWriter = new PrintWriter(socket.getOutputStream(),true) //将printwriter中的信息流写入到套接字的输出流传送给服务端

jTextArea.setText("已完成连接\n\n")

} catch (Exception e) {

e.printStackTrace()

}

}

public static void main(String[] args) {

MyTcpClient myTcpClient = new MyTcpClient("向服务器发送数据")

myTcpClient.setSize(500,200)

myTcpClient.setVisible(true)

myTcpClient.connect()

}

}

3.效果展示

<1>先将服务端的程序跑起来

<2>再将客户端的程序跑起来

<3>.客户端和服务端进行交互

测试用例设计和执行是测试工作的核心,也是工作量最大的任务之一。

测试用例颤岩(Test Case)目前没有经典的定义。比较通常的说法是:指对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等,并形成文档。

测试用例编写准备

1

从配置管理员处申请软件配置:《需求规格说明书》和《设计说明书》;

2

根据需求规格说明书和设计说明书,详细理解用户的真正需求,并且对软件所实现的功能已经准确理解,然后着手制订测试用例。

测试用例制定的原则

1测试用例要包括欲测试的功能、应输入的数据和预期的输出结果。

2测试数据应该选用少量、高效的测试数据进行尽可能完备的测试。

用例覆盖蔽告

1正确性测试:输入用户实际数据以验证系统是满足需求规格说明书的要求;测试用 例中的测试点应首先保证要至少覆盖需求规格说明书中的各项功能,并且正常。

2容错性(健壮性)测试:程序能够接收正确数据输入并且产生正确(预期)的输出, 输入非法数据(非法类型、不符合要求的数据、溢出数据等),程序应能给出提示 并进行相应处理。把自己想象成一名对产品 *** 作一点也不懂的客户,在进行任意 *** 作。

3完整(安全)性测试:对未经授权的人使用软件系统或数据茄并御的企图,系统能够控制的程度,程序的数据处理能够保持外部信息(数据库或文件)的完整。

4接口间测试:测试各个模块相互间的协调和通信情况,数据输入输出的一致性和正确性。

5压力测试:输入10条记录运行各个功能,输入30条记录运行,输入50条记录进行测试。

6性能:完成预定的功能,系统的运行时间(主要是针对数据库而言)。

7可理解( *** 作)性:理解和使用该系统的难易程度(界面友好性)。

8可移植性:在不同 *** 作系统及硬件配置情况下的运行性。

测试方法

1边界值分析法:确定边界情况(刚好等于、稍小于和稍大于和刚刚大于等价类边界值),针对我们的系统在测试过程中主要输入一些合法数据/非法数据,主要在边界值附近选取。

2等价划分:将所有可能的输入数据(有效的和无效的)划分成若干个等价类。

3错误推测:主要是根据测试经验和直觉,参照以往的软件系统出现错误之处。

测试用例的填写

1一个软件系统或项目共用一套完整的测试用例,整个系统测试过程测试完毕,将实际测试结果填写到测试用例中, *** 作步骤应尽可能的详细,测试结论是指最终的测试结果(结论为:通过或不通过)。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12376838.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存