社区
Java SE
帖子详情
如何针对大型的项目进行单元测试?(java junit)
rujor
2003-11-28 12:57:25
我看到的例子全是测试一个类的输出的。一个大型的项目,里面的类繁多,有输出的也有没输出的?怎么进行测试?有什么例子和文档没有?给个连接谢谢。
...全文
518
17
打赏
收藏
如何针对大型的项目进行单元测试?(java junit)
我看到的例子全是测试一个类的输出的。一个大型的项目,里面的类繁多,有输出的也有没输出的?怎么进行测试?有什么例子和文档没有?给个连接谢谢。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
17 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
luckyker
2003-12-19
打赏
举报
回复
学习:)
rujor
2003-11-29
打赏
举报
回复
没人讨论了?
rujor
2003-11-29
打赏
举报
回复
不懂,再看看。
xiaohaiz
2003-11-28
打赏
举报
回复
数据你要使用MOCK OBJECT的方式来自己构造。
rujor
2003-11-28
打赏
举报
回复
可是有些数据是从其它模块传输进来的,那么这些数据我是要自己模拟构造,还是将其它模块先load进来,然后产生数据?不好意思,班车马上开了,明天我继续来。谢谢。
BenKelly
2003-11-28
打赏
举报
回复
你是说你连单元测试还不会,那么谈大型项目不就多余了。
其实单元测试用例非常好构造,junit已经为你建立了测试框架。你只要按照使用你的方法的用户的调用过程建立测试用例就行了。
xiaohaiz
2003-11-28
打赏
举报
回复
那么你只需要对你自己的小段负责即可。保证你的小段代码的单元测试可以独立地运行而不依赖其他的东西(这是比较关键的地方)。
rujor
2003-11-28
打赏
举报
回复
还有比如我在一个大的工程中只负责一小段代码,我怎么才能初始化好所有的环境然后load的的代码或者我的测试呢?我的意思是运行的代码的先决条件怎么先构造起来?
rujor
2003-11-28
打赏
举报
回复
是啊,关键是怎么设计一个个的单元测试可行啊。
BenKelly
2003-11-28
打赏
举报
回复
我们原来进行单元测试的时候有两种方式:
1、如你所说的那种普通的单元测试;
2、将有关联的单元测试用力打成一个 test suite进行大的测试;我们当时将一个子系统中300多个单元测试用力打成一个suite,这样就可以实现你所说的单元用力测试模块了。
xiaohaiz
2003-11-28
打赏
举报
回复
而DefaultConfigLoader的单元测试就会相对复杂一点了。关键在于你难以做断言。为什么呢?因为DefaultConfigLoader读取配置文件config.xml,如果要做断言就必须依据config.xml的内容进行断言才能保证DefaultConfigLoader的功能实现是正确的。
但是偏偏config.xml是一个用户可以修改内容的配置文件,当然不能限定用户配置什么内容。所以这个地方如果要做单元测试就一定要使用MOCK OBJECT的方式,使用一个测试专用的数据文件来进行单元测试。篇幅太长,就不多说了,楼主可以思考一下。
xiaohaiz
2003-11-28
打赏
举报
回复
ConfigLoaderFactory的单元测试相对简单,可以分为两项完成:
(1) ConfigLoaderFactory作为一个单例(Singleton)类存在;
(2) getConfigLoader方法可以正确返回一个ConfigLoader的实例;
所以可以做成这样:
<<
public class TestConfigLoaderFactory extends TestCase {
public TestConfigLoaderFactory(String name) {super(name);}
public void testSingelton() throws Exception {
ConfigLoaderFactory inst1 = ConfigLoaderFactory.getInstance();
ConfigLoaderFactory inst2 = ConfigLoaderFactory.getInstance();
assertNotNull(inst1);
assertNotNull(inst2);
assertSame(inst1, inst2);
Class clazz = Class.forName("ConfigLoaderFactory");
assertNotNull(clazz);
assertEquals(0, clazz.getConstructor().length);
}
public void testGetConfigLoader() {
ConfigLoaderFactory factory = ConfigLoaderFactory.getInstance();
assertNotNull(factory.getConfigLoader());
}
}
>>
经过这个单元测试,你一定可以确认Factory是单例类,并且invoke getConfigLoader方法可以保证返回一个ConfigLoader的具体实现类,至于是何种具体实现类,在这个简单的需求内可以不用考虑。
xiaohaiz
2003-11-28
打赏
举报
回复
别客气,大家一起切磋学习。
俺们来看看这个例子真实是如何使用的:
<<
ConfigLoaderFactory factory = ConfigLoaderFactory.getInstance();
ConfigLoader configLoader = factory.getConfigLoader();
Config aConfig = configLoader.load("h1");
>>
类似于上面的写法,那么我们应该如何测试呢?直接向下面这样验证:
<<
assertEquals("192.168.0.1", aConfig.getHost());
assertEquals("11111", aConfig.getPort());
>>
显然并不好,为什么呢?因为这样的逻辑很复杂了,如果assert失败,你怎么能够精准地判断是在什么地方出现了异常而导致的?是工厂返回的实例错误?是加载的时候错误?(可能例子没有这么复杂,但是实际情况可能复杂程度远远超出预期)。
因此,俺们需要把职责划分清楚,把单元测试分布到每个职责上面去。
还是以这个例子来说,我们可以区分出两项:
(1) ConfigLoaderFactory: 它的职责是创建一个ConfigLoader的实例,仅仅在于创建实例。
(2) DefaultConfigLoader: 它的职责在于从配置文件加载并缓存到内存而已。
所以单元测试就可以分布到这两项上面分别进行测试。只要两项单元测试都没有问题,就能够断言可以完成正确的配置加载功能。
rujor
2003-11-28
打赏
举报
回复
不好意思,不是不接招是不敢接招啊。
rujor
2003-11-28
打赏
举报
回复
小的不接招,你的意思是在大型系统中要合理设计使得可以进行单元测试?那就是说一个个的测下来?
就象大哥举的例子,我怎么才能既测试ConfigLoader,又能测试 ConfigLoaderFactory 呢?
yjawal8071
2003-11-28
打赏
举报
回复
学习ing
xiaohaiz
2003-11-28
打赏
举报
回复
单元测试讲究的是要把测试分布。类的职责要明晰,SRP(Single Resposibility Principle),这样才能对较大的系统作单元测试,需要重构的地方一定要重构使之可以单元测试。
比如,我举一个小小的例子来问问楼主,你看如何做单元测试?
<<
需要从一个配置文件config.xml中加载配置(配置文件是用户可以修改内容的),比如
<?xml version="1.0" encoding="UTF-8"?>
<config>
<host name="h1" ip="192.168.0.1" port="11111"/>
<host name="h2" ip="192.168.0.2" port="11112"/>
</config>
有一个数据结构可以描述这个配置信息:
public class Config {
private String name;
private String ip;
private String port;
}
定义了加载配置需要的业务接口:
public interface ConfigLoader {
public Config load(String name);
}
针对此接口作了具体的实现:
class DefaultConfigLoader implements ConfigLoader {
.... ....
}
辅助此接口的是一个工厂类(一般是单例),用它来产生ConfigLoader的实例:
public final class ConfigLoaderFactory {
public static ConfigLoaderFactory getInstance() {...}
public ConfigLoader getConfigLoader() {...}
}
>>
楼主觉得这些内容需要如何做单元测试呢?
leetcode和oj-algs-multi-langs:C/C++、
Java
、Python的算法与数据结构的整理和收集,推崇TDD,使用Ba
leetcode 和 oj ...
进行
单元测试
;
Java
当然是
JUnit
5;Python 直接使用内置的标准库模块 unittest。 除了测试,文档也是非常有必要的。目前尝试使用 Doxygen 作为一个通用的文档生成工具(主要针对
如何
进行
java
单元测试
_如何
进行
进行
junit
单元测试
java
的
单元测试
单元测试
:是针对一个独立的工作单元
进行
正确性验证的测试。有时也被称为程序员测试,以同QA测试、客户测试相区分。
java
的
单元测试
:在
Java
程序中,一个工作单元通常是指一个方法,那么也就是对一个...
Java
中的
单元测试
:
JUnit
5实践指南
不仅如此,
JUnit
5还提供了大量的注解和断言方法,让咱们可以针对不同的测试场景编写出更加精准和高效的测试代码。在下一章中,小黑将带咱们深入探讨
JUnit
5中的高级特性,让咱们的测试能力再上一个新的台阶。在接下来...
Android
单元测试
之
JUnit
4
单元测试
是什么 首先我们来介绍一下什么是
单元测试
?...从名字上看,
单元测试
就是参与
项目
开发的工程师在
项目
中为了测试某一个代码单元而写的测试代码,用于执行
项目
中的目标函数并验证其逻辑状态或者结果...
Java
10:
Junit
单元测试
、注解、模块化
1.
Junit
单元测试
1.1
Junit
单元测试
概述 测试分类: 1. 黑盒测试:不需要写代码(看不到代码),给输入值,看程序是否能够输出期望的值。 2. 白盒测试:需要写代码的。关注程序具体的执行流程。 1.2 普通测试...
Java SE
62,614
社区成员
307,326
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章