小编ava*_*sen的帖子

单元测试:在设置方法中使用断言是一个好习惯吗?

在单元测试中,setup方法用于创建测试所需的对象.

在那些设置方法中,我喜欢使用断言:我知道我想在这些对象中看到什么值,我喜欢通过断言来记录这些知识.

在最近的文章中对单元测试调用其他单元测试在这里计算器,总的感觉似乎是,单元测试应该没有调用其他检查:这个问题的答案似乎是,你应该重构你的设置,使测试用例做不相互依赖.

但是"设置与断言"和单元测试调用其他单元测试没有太大区别.

因此我的问题是:在设置方法中使用断言是一种好习惯吗?

编辑:

答案结果证明:这不是一般的好习惯.如果需要测试设置结果,建议在断言中添加单独的测试方法(我勾选的答案); 为了记录意图,请考虑使用Java断言.

refactoring unit-testing fixtures assertions

31
推荐指数
3
解决办法
8374
查看次数

Java声明断断续续吗?

在探讨问题时,我最近assert在Java中发现了关键字.起初,我很兴奋.我还不知道有用的东西!一种更有效的方法来检查输入参数的有效性!耶老师!

但后来我仔细研究了一下,我的热情并没有像一个简单的事实那样"完全被扼杀"而"温和":你可以关闭断言.*

这听起来像是一场噩梦.如果我断言我不希望代码继续输入,如果输入listOfStuffnull,为什么我想要忽略该断言?听起来好像我正在调试一段生产代码,并怀疑listOfStuff可能错误地传递了一个,null但没有看到任何触发该断言的日志文件证据,我不相信listOfStuff实际上已经发送了一个有效值; 我还必须考虑断言可能完全被关闭的可能性.

这假设我是调试代码的人.不熟悉断言的人可能会看到并且(非常合理地)假设如果断言消息没有出现在日志中,则不会出现listOfStuff问题.如果你的第一次遭遇assert是在野外,你甚至会发现它可以完全关闭吗?毕竟,它不像是一个允许你禁用try/catch块的命令行选项.

所有这些都让我想到了我的问题(这一个问题,而不是一个咆哮的借口!我保证!):

我错过了什么?

是否有一些细微差别使得Java的实现assert比我给它的功劳更有用?在某些情况下,从命令行启用/禁用它的能力实际上是非常有价值的吗?当我设想在生产代码中使用它代替语句时,我是否误解了它if (listOfStuff == null) barf();

我觉得这里有一些重要的东西,我没有得到.

*好的,从技术上讲,它们实际上是默认关闭的; 你必须不遗余力地打开它们.但是,你仍然可以完全击败他们.


编辑: 启蒙要求,启示收到.

assert首先是一个调试工具的概念需要很长的路要走,才能使它对我有意义.

我仍然认为应该在生产环境中禁用输入检查非平凡私有方法的概念,因为开发人员认为不可能输入错误.根据我的经验,成熟的生产代码是一种疯狂的,庞大的东西,多年来由具有不同技能的人们开发,其目标是快速变化的不同程度的理智要求.即使糟糕的输入确实是不可能的,从现在起六个月后的一段邋maintenance维护编码也可以改变这一点. 提供的链接gustafc(谢谢!)包括这个例子:

assert interval > 0 && interval <= 1000/MAX_REFRESH_RATE : interval;

禁用如此简单的生产检查让我感到愚蠢乐观.然而,这是编码哲学的差异,而不是破碎的特征.

另外,我绝对可以看到这样的价值:

assert reallyExpensiveSanityCheck(someObject) : someObject;

感谢所有花时间帮助我理解这个功能的人; 这是非常赞赏.

java language-features assert design-by-contract

25
推荐指数
4
解决办法
2657
查看次数

使用assertTrue而不是assertNull时缺少分支

在Java/Junit中,我需要使用某个对象测试null.我可以通过多种方式测试条件,但我一直在使用assertTrue进行大多数测试.当我在assertTrue中检查空值时,EclEmma声明它只测试一个分支.

当我手动将语句解析为变量(比如将结果设置为布尔值并将其传递给assertTrue)时,代码覆盖率在断言上被认为是完整的,而不是在变量初始化行上.

为什么会这样?这是否与Java显然添加的额外字节代码相关,如http://sourceforge.net/apps/trac/eclemma/wiki/FilteringOptions所述?任何解决方案(除了使用其他断言语句).

assertTrue:

assertTrue( myObject == null ); //1 of 2 branches
Run Code Online (Sandbox Code Playgroud)

assertTrue:

boolean test = (myObject == null); //1 of 2 branches missing
assertTrue(test); // complete
Run Code Online (Sandbox Code Playgroud)

assertNull:

assertNull( myObject ) //complete;
Run Code Online (Sandbox Code Playgroud)

junit code-coverage bytecode emma jacoco

17
推荐指数
1
解决办法
2万
查看次数

11
推荐指数
2
解决办法
9855
查看次数

证明MC/DC唯一原因定义符合性

我正在阅读关于MC/DC的以下文章:http://shemesh.larc.nasa.gov/fm/papers/Hayhurst-2001-tm210876-MCDC.pdf.

我有源代码:Z := (A or B) and (C or D)以及以下测试用例:

-----------------
| A | F F T F T |
| B | F T F T F |
| C | T F F T T |
| D | F T F F F |
| Z | F T F T T |
-----------------
Run Code Online (Sandbox Code Playgroud)

我想证明所提到的测试用例符合唯一原因定义.

我开始消除蒙面测试:

  • A or B = F T T T T,这意味着它掩盖所述第一测试情况下,从C or D作为F …

code-coverage mc-dc

7
推荐指数
1
解决办法
896
查看次数

在一个语句中测试许多AND/OR条件的覆盖范围

示例声明:

if (conditionA && conditionB && conditionC && conditionD) {
    return true;
}
Run Code Online (Sandbox Code Playgroud)

我可以为所有2 ^ 4组合编写单元测试,但如果添加更多条件,这很容易失控.

我的单元测试策略应该涵盖这样的声明的所有条件?有没有其他方法可以使代码更健壮?

java junit unit-testing code-coverage mc-dc

6
推荐指数
2
解决办法
773
查看次数

如何包装 JUnit 5 测试

在 JUnit 4 中,您可以使用规则来包装测试,以便您可以在测试运行之前和之后执行代码。在大多数情况下,这可以通过 @Before 和 @After 方法或 ExternalResource 规则来完成。然而,一些控制流结构(如 try-with-resources)不能分成两种方法。在大多数情况下,这些构造有替代方案,允许您将它们拆分为两种方法。例如,使用 try-with-resources,您可以手动获取和关闭资源,而不是使用 try 块。

我遇到的具体问题是我使用的数据库库 jOOQ 只有采用回调的事务方法。(请参阅https://www.jooq.org/doc/latest/manual/sql-execution/transaction-management/)您不能调用以下内容:

context.startTransaction()
doStuff()
context.commit() // Or rollback()
Run Code Online (Sandbox Code Playgroud)

在 JUnit4 中,这是可以的,因为您可以编写这样的规则(在 Kotlin 中,但在 Java 中等效):

class TransactionRule(private val dbSessionManager: DBSessionManager) : TestRule {
    override fun apply(base: Statement, description: Description): Statement {
        return object : Statement() {
            override fun evaluate() {
                dbSessionManager.transaction {
                    base.evaluate()

                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

JUnit 5 中有类似的东西吗?

junit junit5

5
推荐指数
1
解决办法
1064
查看次数

Maven挂在Windows上

我正在尝试使用maven(mvn)构建一个项目.您可能知道(对于以前使用过mvn的人),如果项目缺少任何构建依赖项,mvn首先从某个地方下载这些依赖项(我猜中央存储库).我的问题是,在Windows 7上,mvn在此下载阶段非确定性且经常挂起.昨天,我已经等了10个小时才能下载一个小到300-400 kbs的依赖项.有人知道如何解决这个问题或原因是什么?

谢谢,

windows maven java-7

1
推荐指数
1
解决办法
2167
查看次数

Maven Findbugs不在站点生命周期中生成报告

我正在尝试为站点报告创建Findbugs HTML报告.我终于让Findbugs实际运行(在它跳过之前),因为我必须在报告findbugs<build>阶段中包含目标find bugs.但是,findbugs.html即使我在我的<reporting>部分中定义了findbugs ,也不会生成报告.

这是我对Findbugs的配置:

<build>
    <plugins>
        ...
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>findbugs-maven-plugin</artifactId>
            <version>2.5.2</version>
            <configuration>
                <xmlOutput>true</xmlOutput>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>findbugs</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
      ....
    <plugins>
</build>
....
<reporting>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>findbugs-maven-plugin</artifactId>
            <version>2.5.2</version>
            <configuration>
                <xmlOutput>true</xmlOutput>
                <failOnError>false</failOnError>
                <xmlOutput>true</xmlOutput>
                <skip>false</skip>
            </configuration>
        </plugin>
    </plugins>
<reporting>
Run Code Online (Sandbox Code Playgroud)

我的执行看起来像这样:

$ mvn clean site
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building project 2.0.4
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ crypto ---
[INFO] Deleting …
Run Code Online (Sandbox Code Playgroud)

maven-2 findbugs maven

1
推荐指数
1
解决办法
3751
查看次数

如何在Java中删除重复的列表遍历

我正在创建一个solitare纸牌游戏,在arraylist中存储卡片.我想创建两种方法来检查玩家的移动和游戏.

一个布尔函数,它通过ArrayList并检查是否有任何可能的移动.如果有可能,该方法返回true.

第二个动作.它还会通过ArrayList并检查是否有任何可能的移动,进行此移动并停止工作.为了阻止它我使用return true.但我认为这不是好方法.

两个函数非常相似,代码重复.怎么解决?看起来这个方法是否可以返回布尔值或两个可以移动的卡(a和b)?

public boolean makeMove() {
    int a = 0; //index of one card
    int b; //index of second card
    for (b = getSize() - 1; b > 0; b--) {
        for (a = 0; a < b; a++) {
            if (isCorrectMove(a, b)) {
                swap(a, b); //makes move
                return true; //exit after move
            }
        }
    }
    return false; //if there was no move
}

public boolean isPossibleAnyMove() {int a = 0; //index of one card
        int b; …
Run Code Online (Sandbox Code Playgroud)

java oop arraylist

1
推荐指数
1
解决办法
88
查看次数

如何在 JUnit 中测试错误路径和极端情况?

我有代码,我必须为它编写 JUnit 测试。我已经为快乐路径编写了测试,但我必须为极端情况和错误路径编写测试。你能帮我找到解决方案吗?

public String reverseWords(String input) {
    String oneOrMoreSpaces = "\\s+";
    String[] words = input.split(oneOrMoreSpaces);
    String completeAnagram = "";

    for (int i = 0; i < words.length; i++) {
        char[] symbol = words[i].toCharArray();
        char newSymbolSequence;
        int j = symbol.length - 1, k = 0;

        while (k < j) {
            if (!Character.isAlphabetic(symbol[k]))
                k++;
            else if (!Character.isAlphabetic(symbol[j]))
                j--;
            else {
                newSymbolSequence = symbol[k];
                symbol[k] = symbol[j];
                symbol[j] = newSymbolSequence;
                k++;
                j--;
            }
        }
        completeAnagram = new String(symbol);
    }
    return completeAnagram;
}
Run Code Online (Sandbox Code Playgroud)

java junit

1
推荐指数
1
解决办法
357
查看次数

将angular-cli从版本4升级到7后,npm安装中断

我试图将我的一个Angular4项目转换为Angular7.这些是我将Angular4项目转换为Angular7所遵循的步骤.

  1. 我卸载了旧版本的angular-cli
  2. 我安装了更新版本的angular-cli
  3. 现在,当我尝试这样做时,npm install它给了我如下所述的错误.

如果我没有按照正确的步骤升级到Angular7,请纠正我

compiler_cli_1.readConfiguration is not a function
TypeError: compiler_cli_1.readConfiguration is not a function
at AngularCompilerPlugin._setupOptions (V:\LamdaAngular\livepinangularwebsite\node_modules\@ngtools\webpack\src\angular_compiler_plugin.js:91:39)
at new AngularCompilerPlugin (V:\LamdaAngular\livepinangularwebsite\node_modules\@ngtools\webpack\src\angular_compiler_plugin.js:52:14)
at _createAotPlugin (V:\LamdaAngular\livepinangularwebsite\node_modules\@angular-devkit\build-angular\src\angular-cli-files\models\webpack-configs\typescript.js:41:12)
at Object.getNonAotConfig (V:\LamdaAngular\livepinangularwebsite\node_modules\@angular-devkit\build-angular\src\angular-cli-files\models\webpack-configs\typescript.js:47:19)
at BrowserBuilder.buildWebpackConfig (V:\LamdaAngular\livepinangularwebsite\node_modules\@angular-devkit\build-angular\src\browser\index.js:84:37)
at DevServerBuilder.buildWebpackConfig (V:\LamdaAngular\livepinangularwebsite\node_modules\@angular-devkit\build-angular\src\dev-server\index.js:111:46)
at MergeMapSubscriber.check_port_1.checkPort.pipe.operators_1.concatMap [as project] (V:\LamdaAngular\livepinangularwebsite\node_modules\@angular-devkit\build-angular\src\dev-server\index.js:38:40)
at MergeMapSubscriber._tryNext (V:\LamdaAngular\livepinangularwebsite\node_modules\@angular-devkit\build-angular\node_modules\rxjs\internal\operators\mergeMap.js:69:27)
at MergeMapSubscriber._next (V:\LamdaAngular\livepinangularwebsite\node_modules\@angular-devkit\build-angular\node_modules\rxjs\internal\operators\mergeMap.js:59:18)
at MergeMapSubscriber.Subscriber.next (V:\LamdaAngular\livepinangularwebsite\node_modules\@angular-devkit\build-angular\node_modules\rxjs\internal\Subscriber.js:67:18)
at TapSubscriber._next (V:\LamdaAngular\livepinangularwebsite\node_modules\@angular-devkit\build-angular\node_modules\rxjs\internal\operators\tap.js:65:26)
at TapSubscriber.Subscriber.next (V:\LamdaAngular\livepinangularwebsite\node_modules\@angular-devkit\build-angular\node_modules\rxjs\internal\Subscriber.js:67:18)
at MergeMapSubscriber.notifyNext (V:\LamdaAngular\livepinangularwebsite\node_modules\@angular-devkit\build-angular\node_modules\rxjs\internal\operators\mergeMap.js:92:26)
at InnerSubscriber._next (V:\LamdaAngular\livepinangularwebsite\node_modules\@angular-devkit\build-angular\node_modules\rxjs\internal\InnerSubscriber.js:28:21)
at InnerSubscriber.Subscriber.next (V:\LamdaAngular\livepinangularwebsite\node_modules\@angular-devkit\build-angular\node_modules\rxjs\internal\Subscriber.js:67:18)
at ForkJoinSubscriber.notifyComplete (V:\LamdaAngular\livepinangularwebsite\node_modules\@angular-devkit\build-angular\node_modules\rxjs\internal\observable\forkJoin.js:82:25)
Run Code Online (Sandbox Code Playgroud)

angular-cli angular

0
推荐指数
1
解决办法
1604
查看次数