0 0

写TDD的测试是否不应该对private方法进行测试10

再非TDD的测试中,会遇到写测试的时候想对一段逻辑(通常是函数)进行测试却发现这个函数是private在测试,不能访问的问题.遇到这种情况我一般有两种方式处理
1. 将该函数声明为public的, 但是这样破坏了这个类的封装性
2. 将函数声明为protected,然后将测试类放在同样的包下(不同的源码包), 但是也不是很好

所以在非TDD的测试中,更多的是进行最粗粒度的service层(类似于API)的测试.

现在偶在尝试TDD, 让domain有更多的职责使其丰富起来,但是这个问题依然困扰我.
那么TDD是不是应该避免这个问题呢?
我对于TDD是这样理解的,更多的是通过测试来进行设计,在编写测试的过程中将对象之间的交互和关系体现出来,因此主要针对Service层(系统对外部提供API)以下的测试
如果我遇到在非TDD测试中访问private函数的问题的时候,我是不是就应该考虑
1. 自己过于关注细节,只要看结果即可
2. 是不是应该将这个方法放到其它的类中,由这个类提供public方法出来,并且根据这个类编写另外的测试(tell don't ask)

不知道我对此的理解是否正确
问题补充
三楼发的几个链接相当不错,很全面详细地说了几种测试private的方法
别的没有记住.老外的那个比喻太搞了
just like mother used to say not to expose your private!!!
相当雷人哈
2010年11月04日 15:21

12个答案 按时间排序 按投票排序

0 0

采纳的答案

一般不测试private方法的,貌似都是对面向对象超级精通的大牛。人家知道哪个方法应该是private,哪些不是。

对于我等彩笔,还是老老实实的写吧。

http://www.artima.com/suiterunner/private2.html
java 单元测试,使用反射, 以及一个PrivateMethodAccessor 类。来实现。
缺点是测试代码比较冗长。


http://kailuowang.blogspot.com/2010/08/testing-private-methods-in-rspec.html
http://blog.jayfields.com/2007/11/ruby-testing-private-methods.html
ruby: (rspec), 在每个test之前,将目标方法从 private 改成 public, 之后再改回来。

http://www.ruby-forum.com/topic/78762
好几个人都不赞同测试private method

2010年11月04日 15:21
0 0

iamlotus 写道
你设计一个POS机程序的时候会测试银行内部是如何转账的吗?

另外,有这个问题说明混淆了Test Driven 于 Test First。
需要测试private的流程都不是TDD,最多是Test First Development。预先写了个interface就开始写full test,写着写着发现function的scope太大,分支太多,testcase不好写,于是就想直接测private function是不是简单点。
这还是 Design在前的一套,只不过把 Design->Code->Test 的顺序变成了 Design->Test->Code。
TDD讲究的是设计从重构中来,而不是预设计,TDD要求的第一点就是Testable,被抽取的责任需要验证的话就用一个单独的class去实现,怎么会有需要单独测试的private方法呢?

这不是教条么?虽然说得有理,但是完全没有Desing就开始Test,有太大意义么?

2010年11月04日 15:21
0 0

你设计一个POS机程序的时候会测试银行内部是如何转账的吗?

另外,有这个问题说明混淆了Test Driven 于 Test First。
需要测试private的流程都不是TDD,最多是Test First Development。预先写了个interface就开始写full test,写着写着发现function的scope太大,分支太多,testcase不好写,于是就想直接测private function是不是简单点。
这还是 Design在前的一套,只不过把 Design->Code->Test 的顺序变成了 Design->Test->Code。
TDD讲究的是设计从重构中来,而不是预设计,TDD要求的第一点就是Testable,被抽取的责任需要验证的话就用一个单独的class去实现,怎么会有需要单独测试的private方法呢?

2010年11月04日 15:21
0 0

我觉的不该测试private方法,本身private方法一定会被protected or public方法所调用,那些才是应该测试的

2010年11月04日 15:21
0 0

为什么会出现private方法?

用TDD方式写程序,会产生楼主这个问题吗?

2010年11月04日 15:21
0 0

不加任何修饰,然后测试代码和目标类同一个包名下。

2010年11月04日 15:21
0 0

本身就不需要测试private方法~哪个SB第一个想出来要TDDprivate方法的?吃饱饭没事情做啊?

2010年11月04日 15:21
0 0

不是将private修改为protect及public.
而是修改成 package,包内可见.

满足测试需要即可,千万不要还搞反射等SB玩意.

2010年11月04日 15:21
0 0

我想知道,private方法是怎么来的?

2010年11月04日 15:21
0 0

1 如果可以正确的判定方法的访问类型,则不用测试private。
2 如果你是搞卫星,火箭,金融,医疗,还是测试一下吧。

2010年11月04日 15:21
0 0

sg552 写道
一般不测试private方法的,貌似都是对面向对象超级精通的大牛。人家知道哪个方法应该是private,哪些不是。

对于我等彩笔,还是老老实实的写吧。

http://www.artima.com/suiterunner/private2.html
java 单元测试,使用反射, 以及一个PrivateMethodAccessor 类。来实现。
缺点是测试代码比较冗长。


http://kailuowang.blogspot.com/2010/08/testing-private-methods-in-rspec.html
http://blog.jayfields.com/2007/11/ruby-testing-private-methods.html
ruby: (rspec), 在每个test之前,将目标方法从 private 改成 public, 之后再改回来。

http://www.ruby-forum.com/topic/78762
好几个人都不赞同测试private method

主要是太麻烦了....
为测试个private方法还得动用反射
测试出错可能性大大超过源码业务逻辑错误.

如果需要测试 设计时不要设计成private才是王道 .
PS:私有,公有之间还有两种声明方式的.....

2010年11月04日 15:21
0 0

这样的争论在tdd社区中已经持续了很长时间了。一般的看法是不应该单独测试private的方法,而应该通过测试public的方法间接达到多private的覆盖。其实,当你需要测试private方法的时候,更应该问你自己的问题是,我真的需要测试这个吗?有没有可能吧这个逻辑抽出到另外一类中?

2010年11月04日 15:21

相关推荐

    优化对Private方法进行单元测试Demo

    然而,对于“优化对Private方法进行单元测试Demo”这一主题,我们需要理解一个核心原则:通常不应直接对private方法进行单元测试。这是因为单元测试的目标是验证公共接口的行为,而不是内部实现细节。 首先,让我们...

    JUnit测试代码示例

    单元测试是对软件中的最小可测试单元进行检查,如方法或类。其目标是确保每个部分都能独立地按预期工作,以便于找出并修复潜在的错误。 JUnit是基于Java的测试框架,由Ernst Kuipers和Kent Beck开发,最初为JUnit2...

    JUnit 4测试驱动开发----junit技术讲解

    单元测试是对软件中最小可测试单元进行验证的过程,通常是单个函数或方法。它的目的是确保代码的每个部分都能按预期工作。在JUnit 4中,每个@Test注解的方法就是一个单元测试,每个测试方法应该独立于其他方法运行,...

    Junit4测试总结

    这些断言方法可以帮助我们判断程序的输出是否正确,是测试的关键组成部分。 ```java @Test public void testExample() { int result = add(1, 2); assertEquals(3, result); } ``` ### 三、异常测试 通过`@Test...

    在Eclipse中使用JUnit4进行单元测试

    在Eclipse中使用JUnit4进行单元测试是一种常见的软件开发实践,它可以帮助开发者验证代码的各个模块是否按预期工作。JUnit4是Java编程语言中最流行的单元测试框架,它提供了丰富的注解和API,使得编写和执行测试用例...

    Mock模拟测试使用

    这种方法不仅提高了测试速度,还减少了对外部因素的依赖。 ##### 3.5、Mock可以交给用户 通过提供Mock对象,可以让最终用户在没有完全部署的系统中体验应用程序的部分功能。这对于收集用户反馈非常有用,可以帮助...

    JUnit多参数测试实例整合FizzBuzz

    单元测试,特别是使用自动化工具如JUnit进行的测试,可以有效地检查代码的各个独立部分是否按预期工作。本文将详细讲解如何使用JUnit进行多参数测试,并结合经典的FizzBuzz问题,展示其实战应用。 首先,JUnit是...

    JUnit使用报告

    在这个例子中,我们使用了JUnit的注解`@Before`和`@After`来设置测试前的准备工作和测试后的清理工作,`assertEquals`方法用于断言预期结果与实际结果是否相符。 五、测试驱动开发(TDD) TDD是一种开发方法论,强调...

    TDD_Simple_String_Calculator:使用TDD方法创建一个简单的String计算器

    在本文中,我们将深入探讨如何使用测试驱动开发(TDD)方法来创建一个简单的String计算器。TDD是一种软件开发过程,它强调先编写测试用例,然后根据这些测试编写功能代码,确保代码满足预期的功能需求。我们将以Java...

    PHP实例开发源码-php最新版微测试源码.zip

    - 测试驱动开发(TDD):先写测试,再编写满足测试的代码,确保代码质量。 5. **文件操作**: - 文件读写:使用fopen、fread、fwrite等函数处理文件。 - 文件上传:通过PHP的$_FILES全局数组接收并处理用户上传...

    harmonyos2-guice-behave:Guice的BDD和TDD测试框架

    是一个应用程序测试框架,旨在帮助编写遵循的测试和方法。 该框架的主要思想是使用语言来自动描述测试,避免使用其他工具或来源。 如何获得 您可以将 Guice Behave 作为 Maven 依赖项获取。 < dependency > < ...

    TDD-String-Calculator:它是字符串计算器的测试驱动开发

    TDD字符串计算器 它是字符串计算器的测试驱动开发 任务 使用方法签名创建一个简单的String计算器: int add(字符串数字) 该方法最多可以包含两个数字,以逗号分隔,并将返回它们的总和。 例如“”或“ 1”或“ 1...

    Junit_about

    2. 参数化测试:使用`@ParameterizedTest`和`@ValueSource`、`@EnumSource`等注解,可以实现对同一测试方法的不同输入参数进行测试。 3. 条件测试:`@EnabledIf`和`@DisabledIf`注解可以根据条件启用或禁用测试。 ...

    JMock单元测试

    对于Struts2中的Action类,我们可以根据不同的情况选择是否使用JMock来进行单元测试: 1. **无需容器支持的情况**:如果Action中的方法没有涉及request、response、session等需要容器支持的对象,那么可以直接使用...

    JUnit讲课文档.doc

    单元测试是对软件中最小可测试单元进行验证的过程。对于Java,这个单元通常是单个方法。单元测试应具备独立性,可重复性和自动验证。目的是确保代码的每一个部分都能按预期工作,并在修改后保持正确性。 ### 4. ...

    Calculadora:第08课,我们创建了具有加,减,乘和除的基本计算器。 为了使用单元测试和TDD

    在本课程中,我们将深入探讨如何使用Java编程语言构建一个基本的计算器,它包含了加、减、乘和除的功能,并采用TDD(测试驱动开发)方法进行开发。TDD是一种软件开发过程,其中编写测试用例是开发过程的先决条件,...

    springjunitlib.zip

    Spring整合JUnit是一个常见的Java开发实践,它允许开发者在Spring的上下文中执行单元测试,从而确保代码的质量...记得在编写测试时遵循“测试驱动开发”(TDD)的原则,先写测试,再编写实现,确保代码满足测试的预期。

    Java_classes_TDD

    例如,对于上面的`Student`类,你可以写一个测试检查构造函数是否正确设置了学生的名字和年龄: ```java import org.junit.Test; import static org.junit.Assert.*; public class StudentTest { @Test public ...

Global site tag (gtag.js) - Google Analytics