只有知道测试方法被调用的顺序时,共享可修改的状态才有意义
只关注测试驱动开发将是程序员忽视大范围或中范围设计的实践
理想情况下,当您编写测试时,需要确保不论底层代码如何改动,这些测试仍然有效。 //在稍高的层面写测试?
如何创建测试不重要,重要的是确实要创建测试。
测试私有方法的方式就是利用反射 在method对象上调用setAccessible() 通知JVM跳过安全性检查
绝大多数时候, 可测试性应该胜过封装
第一点也是最重要的一点,就是尽量避免使用commons-logging。他是没有意义的,只是增加了复杂性。 page。276
测试servlet
@Test(testName="function test")
public class TestRequest {
/**
* 简单测试servlet 模拟出 request response
* 对servelt执行前后的数据进行检查,没有检查out输出
*
*/
@Test(groups = { "function" })
public void testComputerServlet() throws ServletException, IOException {
ComputerServlet cs = new ComputerServlet();
MockServletContext application = new MockServletContext();
MockServletConfig config = new MockServletConfig(application);
cs.init(config);
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
int a = 233, b = 23241;
request.setParameter("num1", a+"");
request.setParameter("num2", b+"");
cs.doGet(request, response);
int sum = Integer.valueOf((String) request.getAttribute("num3"));
Assert.assertEquals(sum, a + b);
}
}
==================================================================================
容器内testng测试
/**
* 以一个servlet的形式执行testng测试
* 这样的好处是这个servlet是在容器中运行的
* 测试的环境和实际使用的生产环境是一样的(相比与容器外的测试)
*/
public class TestServlet extends HttpServlet {
/**
* The doGet method of the servlet. <br>
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
/**
* The doPost method of the servlet. <br>
*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
Runtime runtime = Runtime.getRuntime();
out.println("totalMemory = " + runtime.totalMemory() / 1024.0 / 1024);// 看下测试对jvm内存的影响
TestNG tester = new TestNG();
tester.setDefaultSuiteName("container-tests");
String root = request.getSession().getServletContext().getRealPath("/WEB-INF/classes");
ClassScanner scanner = new ClassScanner(new File(root));
scanner.setLoader(getClass().getClassLoader());
scanner.setFilter(new FileFilter() {
public boolean accept(File pathname) {
return pathname.getPath().indexOf("Test") > -1;
}
});
Class[] classesTobeTest = scanner.getClasses();
tester.setTestClasses(classesTobeTest);
IReporter reporter = new SinglePageReporter(out);
tester.addListener(reporter);
tester.run();
System.out.println("totalMemory = " + Runtime.getRuntime().totalMemory() / 1024.0 / 1024);
out.println("totalMemory = " + Runtime.getRuntime().totalMemory() / 1024.0 / 1024);
out.println("===============");
// out.close();
}
}
铺助类
public class SinglePageReporter extends EmailableReporter {
private Writer writer;
/**
*
*/
public SinglePageReporter(Writer writer) {
this.writer = writer;
}
@Override
protected PrintWriter createWriter(String outdir) throws IOException {
return new PrintWriter(writer);
}
}
public class ClassScanner {
private File root;
private FileFilter filter;
private ClassLoader loader;
private static final Logger log = Logger.getLogger(ClassScanner.class);
private static final String CLASS_EXT = ".class";
/**
* @param root
*/
public ClassScanner(File root) {
super();
this.root = root;
}
public void setFilter(FileFilter filter) {
this.filter = filter;
}
public void setLoader(ClassLoader loader) {
this.loader = loader;
}
public Class[] getClasses() {
List<Class> list = new ArrayList<Class>();
loadClasses(list, root);
return list.toArray(new Class[list.size()]);
}
/**
* @param list
* @param root2
*/
private void loadClasses(List<Class> list, File dir) {
if (dir == null || !dir.isDirectory()) {
return;
}
File[] files = dir.listFiles();
for (File file : files) {
log.debug("scan "+file.getAbsolutePath());
if (file.isDirectory()) {
loadClasses(list, file);
} else if (filter == null || filter.accept(file)) {
if (file.getName().endsWith(CLASS_EXT)) {
int trim = root.toString().length();
String name = file.toString().substring(trim + 1);
name = name.substring(0, name.length() - CLASS_EXT.length());
name = name.replace(File.separatorChar, '.');
try {
Class clazz = loader == null ? Class.forName(name) : loader.loadClass(name);
log.info("loaded "+file.getAbsolutePath());
list.add(clazz);
} catch (Exception e) {
log.warn("error loading class " + name, e);
}
}
}
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="test"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="melibrary.com.genuitec.eclipse.j2eedt.core.MYECLIPSE_JAVAEE_5_CONTAINER"/>
<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/testng-5.11-jdk15.jar"/>
<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/log4j-1.2.15.jar"/>
<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/spring-test.jar" sourcepath="D:/openSource/spring-framework-2.5.6/mock"/>
<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/spring.jar"/>
<classpathentry kind="output" path="WebRoot/WEB-INF/classes"/>
</classpath
分享到:
相关推荐
Spring Framework 的测试框架知识点 涵盖了 Unit Testing、Mock Objects、Environment、JNDI、Servlet API 和 Spring Web Reactive 等方面,提供了许多测试相关的功能和技术,可以帮助开发者更好地测试 Spring ...
了解Cactus的工作方式后,你还可以深入研究它的高级特性,如模拟数据库操作、处理异常情况、集成其他测试框架(如TestNG)等。此外,Cactus还支持EJB、JSP、Struts等Web组件的测试,使得整个Web应用的测试覆盖更加...
- **Java EE**:企业版 Java 平台,主要用于开发大型企业级应用,支持 JSP、Servlet、EJB 等技术。 - **Java ME**:微版 Java 平台,用于开发小型设备上的应用程序,如移动电话、PDA 等。 #### 三、Java 平台介绍...
- **Web**:包含Web、Servlet、Portlet和WebSocket模块,提供在Web环境下的应用支持。 - **AOP**:提供面向切面编程的功能,实现代码的解耦。 - **Instrumentation**:用于类装载时的工具和应用服务器特定的类。 ...
【标签】"软件/插件 java" 显示这个主题与Java编程语言和相关的软件或插件有关。Java是一种广泛使用的面向对象的编程语言,尤其适合构建Web应用程序。这里的“插件”可能指的是用于增强或扩展Java Web功能的工具,如...
13. **持续集成和自动化测试**:在Java EE开发中,使用工具如Maven、Gradle进行项目管理,以及JUnit和TestNG进行单元测试,是提升开发效率和保证质量的关键。 通过深入学习以上知识点,并结合实际项目实践,可以...
6. **构建Web应用程序**:对于Web项目,Maven提供了war插件来打包Web应用为WAR文件,适用于部署到Servlet容器如Tomcat。同时,可以通过`<war><webResources>`配置资源复制和过滤。 7. **多模块项目**:Maven支持多...
2. Maven单元测试命名要求:这是指单元测试在Maven项目中的命名规则,Maven默认会识别以Test结尾的测试类,并使用JUnit或TestNG框架进行测试执行。 3. 在Eclipse中配置Maven插件构建索引:这一知识点涉及在Eclipse...
- **Web**:Web模块,包括Web和Web-Servlet两个子模块,用于支持Web应用开发。 - **Instrumentation**:用于支持Classloader级别的元数据注入,例如在Weblogic、Websphere等服务器上运行时。 - **Messaging**:...
4. `src/test/java`:这里存放的是项目的测试代码,通常使用JUnit、TestNG等测试框架编写的测试类。这些测试类用于验证项目功能的正确性。 5. `src/test/resources`:与主资源目录类似,测试资源文件存储在此处,供...
其次,作为“软件/插件”标签的一部分,这个压缩包可能包含了一些自定义的Java工具或库,例如日志记录器、性能监控工具、自动化测试框架(如JUnit、TestNG)、代码分析工具(如SonarQube)等。这些工具在实际开发...
- **Java EE** 提供了一系列服务、API 和协议,如 JSP、Servlet、Enterprise JavaBeans (EJB)、Java Remote Method Invocation (RMI) 等,这些技术共同构成了开发分布式、多层式、组件化和基于 Web 的应用程序的基础...
虽然描述中没有提供具体细节,但我们可以从Java这个主题出发,探讨一系列相关知识点。 1. **Java基础** - **语法**:包括变量、数据类型、运算符、控制结构(如if语句、switch语句、循环)、方法等。 - **类与...
在IT行业中,Java是一...文件名“0927刘轩圻_小和尚工作.doc”可能是关于这些知识点的讲解或笔记,而“和尚little”可能指的是相关的练习项目或者案例分析。通过深入学习和实践,你可以逐步提升在Java领域的专业能力。
9. **单元测试与集成测试**: 使用JUnit或TestNG进行单元测试,确保代码的质量和功能的正确性。可能还使用了Mockito等工具进行模拟测试。 10. **文档说明**: "说明.pdf"可能是项目的设计文档或用户手册,包含了系统...
BJstudy-master这个目录很可能包含了Java学习的源代码、笔记、教程或其他相关材料。在Java学习过程中,有几个关键的知识点: 1. **基础语法**:包括变量、数据类型、运算符、控制流程(if语句、for循环、while循环...
在JavaStudy-main这个目录下,可能包含了韩明远的项目源代码、测试文件、笔记或者相关的文档。源代码可能涉及了各种Java应用程序或服务的实现,比如命令行工具、GUI程序、Web应用后端或者Android应用。通过阅读和...
这个目录可能包含了源代码、文档、笔记、示例、测试用例等,帮助用户理解并参与到项目中。 在这样的项目中,我们可能可以期待以下知识点: 1. **项目管理基础**:涵盖项目生命周期、项目阶段、WBS(工作分解结构)...
【标题】"Webcamp_0806_...这个压缩包可能包含上述各个主题的相关代码实例、笔记、PPT演示文稿等,帮助学习者深入理解Java在Web开发中的实践应用。通过这些资源,开发者可以提升自己的技能,了解最新的技术和最佳实践。