`
Foxswily
  • 浏览: 77427 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

想要不那么Bad smell 的 UnitTest真不容易

阅读更多

自打用Maven做项目管理之后,直接和UnitTest接触的次数增加,原以为已经三令五申要重视的测试总有那么一股bad smell,开始反思底层或者外围辅助不足,导致开发人员写测试代码压力大,决定着手改善。

 

一、测试工具由JUnit向TestNG转移

    一直用Eclipse自带的JUnit工具,简单方便没得说,但几个有缺憾的地方一直不能改进。一个是static的BeforeClass、AfterClass,这已经臭名远播了,不多说。另一个是没有灵活的分组,为下一步要提到的分组测试带来不少麻烦。这两方面恰恰是TestNG的强项,非static的Before、After,可分组测试,甚至提供线程压力测试的控制等等一堆功能。缺点也有,Eclipse插件做的粗糙,创建Test类比Junit差了几个档次,基本信息都要手填,更没有对测试方法的选择和自动生成。权衡利弊还是坚持选择了TestNG

 

二、Dao层测试用不用DBUnit

    DBUnit可以方便的完成备份表,插入测试数据,实际使用发现如果有外键关联表会有不少麻烦,往往对一个表的测试需要备份、创建N多关联表,再加上使用复杂sql、存储过程的场景,个人倾向DBUnit不强制使用。同时Dao层测试统一group(testNG的好处)

 

@Test(groups = { "dao" })

方便做有选择的测试 

 

 

三、Mock测试

    一般的Web开发其他层次都可以用Mock做到隔离Dao层,个人习惯用JMock,与TestNG配合良好,各种支持完善。

 

Mockery context = new Mockery();
UserService service = new UserServiceImpl();
UserDao userDao = context.mock(UserDao.class);
((UserServiceImpl) service).setUserDao(userDao);

final User user = new User();
user.setId("123");
context.checking(new Expectations() {
	{
		(allowing(userDao)).getUserById("123");
		will(returnValue(user));
		(allowing(userDao)).getUserById("124");
		will(returnValue(null));
	}
});
 

 

    Service层可以轻松应付,完全独立测试,有麻烦的往往在Action层。基于Spring的AppliactionContext在Aciton内部getBean调用Service,造成在UnitTest中没有机会Mock,最后只好Mock掉ApplicationContext

 

ApplicationContext orgContext = SomeContainer.getApplicationContext();
ApplicationContext mockContext = context.mock(ApplicationContext.class);
context.checking(new Expectations() {
	{
		(allowing(mockContext)).getBean("userService", UserService.class);
		will(returnValue(service));
		(allowing(mockContext)).getBean(with(any(String.class)),
				with(any(Class.class)));
		will(new CustomAction("original getBean") {
			@Override
			public Object invoke(Invocation invocation) throws Throwable {
				return orgContext.getBean((String) invocation.getParameter(0),
						(Class<?>) invocation.getParameter(1));
			}
		});
	}
});

 

 针对Action逻辑,mock调用的Service,事后把mockContext植入到框架中。

常规的Action测试照旧,各种Mock,核对结果。

 

@Test(groups = { "action" })

 

 

四、整合的Test

   项目内使用同一的测试基类,把配置导入之类的工作统统接管,减轻测试类压力,要注意全局导入方法要加上

@BeforeSuite(alwaysRun = true)

 testsuite.xml可以有选择的执行某些group或全执行

<suite name="someproject" verbose="1">
	<test name="testPackage">
		<packages>
			<package name="cn.com.xxx.yyy.zzz.test.*" />
		</packages>
	</test>
</suite>

 maven配置做个简单指定

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-surefire-plugin</artifactId>
	<version>2.6</version>
	<configuration>
		<skipTests>false</skipTests>
		<includes>
			<include>**/*Test.java</include>
		</includes>
		<!-- <groups>dao,action</groups>根据需要测试某些group -->
		<suiteXmlFiles>  <suiteXmlFile>src/test/resources/testsuite.xml</suiteXmlFile>
		</suiteXmlFiles>
	</configuration>
</plugin>
 

 

分享到:
评论

相关推荐

    Code Bad Smell Detector-开源

    在软件开发中,"代码坏味道"(Code Smell)是指源代码中可能存在的一些不好的编程习惯或设计模式,这些模式可能暗示着潜在的问题,虽然不影响代码的编译和运行,但可能导致可维护性、可读性和可扩展性降低。...

    A Textual-based Technique for Smell Detection

    TACO(Textual Analysis for Code Smell Detection)是一种新颖的技术,它采用文本分析手段来检测不同性质和不同粒度级别的代码异味。研究人员在10个开源项目上运行了TACO,并将其性能与仅基于代码组件结构信息的...

    检测JavaScript类的内聚耦合Code Smell.pdf

    JavaScript 类的内聚耦合Code Smell检测是软件质量保证的重要方面,因为它涉及到代码的可读性、可维护性和整体设计质量。本文介绍了一种名为JS4C的检测方法,专门针对JavaScript类中的FE(Feature Envy)、DC(Data ...

    沪教版一年级英语下册(牛津版) Unit 3 Taste and smell 第1课时 教案 教学设计 .pdf

    沪教版一年级英语下册(牛津版) Unit 3 Taste and smell 第1课时 教案 教学设计 .pdf

    coca-master.zip

    它不仅能够检测代码中的不良实践(bad smell),进行代码行数统计,还能够分析代码的调用与依赖关系,同时提供Git分析功能,以及支持自动化重构,极大地提升了开发者的工作效率。 首先,让我们深入了解一下Coca如何...

    learning-to-smell-starter-kit

    学习气味-入门套件 :flexed_biceps: 挑战页面: : :speaking_head: 讨论论坛: : :trophy: 页首横幅: : :laptop: 安装git clone ... 这将为您提供类似于以下内容的文件夹结构: .├── data│ ├── test.csv│ ...

    免费低多边形长剑“B'smell”模型包

    长剑“B'smell” 3D 模型(低多边形)/ 免费低多边形长剑“B'smell”模型。。低多边形 模型全部展开并被贴上纹理,可用的纹理格式为 PNG,包括 1k、2k 和 4k 版本。纹理、材料和网格都有适当的名称。模型已完全贴上...

    code-smell-refactoring:几种语言中各种代码异味的小例子

    如果一个if-else结构过于复杂,比如嵌套过深或者包含了多个条件运算符,那么可能需要重构为策略模式、状态模式或使用卫语句(Guard Clause)来简化逻辑。 ### 5. **开关语句(Switch Statement)** 大型的switch或...

    findbugs检查工具

    findbugs是一个开源的eclipse 代码检查工具;它可以简单高效全面地帮助我们发现程序代码中存在的bug,bad smell,以及潜在隐患. 下载的文件包含如下: 1.findbugs的eclipse插件source包 2.安装及使用说明文档

    Findbug使用指南.docx

    2. IM_BAD_CHECK_FOR_ODD Bug:检查奇数的方法,不适用于负数,解决方法是考虑使用 x & 1 == 1 或者 x % 2 != 0。 3. NP_ALWAYS_NULL Pattern:空指针解引用,解决方法是检查代码中的空指针。 4. RCN_REDUNDANT_NULL...

    code_smell_extractor_ci:代码气味提取器在github上的项目

    code_smell_extractor_ci 代码气味提取器在github上的项目安装要做Git: : PMD: : 系统开发Linux运行程序您必须在linux上,并且必须修改src / main / java / utilities / Utility.java中的变量: PATH_PMD =“ [您...

    Smell Agent Optimization.zip气味剂算法及其原文

    在"Smell Agent Optimization.zip"压缩包中,我们可以看到两个主要文件。第一个文件"1-s2.0-S0950705121007486-main.pdf"很可能是一篇学术论文,详细介绍了气味剂算法的理论基础、工作原理以及可能的应用场景。通常...

    第9章 系统编程与图形开发.zip_C语言程序设计经典236例_smell7l9

    在本压缩包文件"第9章 系统编程与图形开发.zip_C语言程序设计经典236例_smell7l9"中,我们主要聚焦于C语言在系统编程和图形开发方面的应用。这本书《C语言程序设计经典236例》通过丰富的实例,帮助读者深入理解和...

    java重构设计.doc

    **Java重构设计** 在软件开发过程中,重构是一个至关重要的步骤,它涉及到对现有代码的改进,以提高代码...实践中,我们应该时刻关注代码的"bad smell",并采取适当的重构策略来解决这些问题,以实现更好的软件设计。

    沪教版一年级英语下册(牛津版) Unit 3 Taste and smell 第2课时 教案 教学设计 .pdf

    沪教版一年级英语下册(牛津版) Unit 3 Taste and smell 第2课时 教案 教学设计 .pdf

    三维多孔介质数值模拟代码.zip_fluent udf_smell62s_三维udf_三维介质_多孔三维

    "三维多孔介质数值模拟代码.zip_fluent udf_smell62s_三维udf_三维介质_多孔三维"这个压缩包文件包含了一套专门用于模拟三维多孔介质环境中的流体流动的代码。下面我们将深入探讨相关知识点。 首先,让我们了解核心...

    jmockit测试例子

    It indeed a bad smell, but before you refactor them, you may need to make them testable firstly. Now, jmockit comes to us. "Tests can easily be written that will mock final classes, static methods...

    Smell-Spotter:用于检测python 3源代码中的安全气味的Visual Studio Code扩展项目

    Bad File Permission Command Injections Cross-site scripting Constructing SQL upon Input Debug Set to True in Deployment Exec Statement Empty Password Hard-coded Secrets Hard-coded IP Address Binding ...

    软件测试中单元测试VS私有方法

    软件测试中单元测试VS私有方法软件测试前几天,NareshJain在ManagedChaos上发了篇博客,总结了一些测试中的badsmell。例如:●一个方法中有太多testcase——被测试的方法做了太多事情。●太多的setup/teardown——...

    SMell05:作业 05 为 394

    "SMell05"这个名字可能代表“Smell 05”,其中“smell”可能是指代码异味(Code Smell),在软件工程中指的是代码中可能存在的问题,虽然它们不一定会导致错误,但可能暗示了设计或实现上的不足。 【描述】"气味05 ...

Global site tag (gtag.js) - Google Analytics