在单元测试中,setup方法用于创建测试所需的对象.
在那些设置方法中,我喜欢使用断言:我知道我想在这些对象中看到什么值,我喜欢通过断言来记录这些知识.
在最近的文章中对单元测试调用其他单元测试在这里计算器,总的感觉似乎是,单元测试应该没有调用其他检查:这个问题的答案似乎是,你应该重构你的设置,使测试用例做不相互依赖.
但是"设置与断言"和单元测试调用其他单元测试没有太大区别.
因此我的问题是:在设置方法中使用断言是一种好习惯吗?
编辑:
答案结果证明:这不是一般的好习惯.如果需要测试设置结果,建议在断言中添加单独的测试方法(我勾选的答案); 为了记录意图,请考虑使用Java断言.
在探讨问题时,我最近assert在Java中发现了关键字.起初,我很兴奋.我还不知道有用的东西!一种更有效的方法来检查输入参数的有效性!耶老师!
但后来我仔细研究了一下,我的热情并没有像一个简单的事实那样"完全被扼杀"而"温和":你可以关闭断言.*
这听起来像是一场噩梦.如果我断言我不希望代码继续输入,如果输入listOfStuff是null,为什么我想要忽略该断言?听起来好像我正在调试一段生产代码,并怀疑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/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) 我何时应该使用Apache Commons的Validate.isTrue,何时应该使用'assert'关键字?
我正在阅读关于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 …示例声明:
if (conditionA && conditionB && conditionC && conditionD) {
return true;
}
Run Code Online (Sandbox Code Playgroud)
我可以为所有2 ^ 4组合编写单元测试,但如果添加更多条件,这很容易失控.
我的单元测试策略应该涵盖这样的声明的所有条件?有没有其他方法可以使代码更健壮?
在 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 中有类似的东西吗?
我正在尝试使用maven(mvn)构建一个项目.您可能知道(对于以前使用过mvn的人),如果项目缺少任何构建依赖项,mvn首先从某个地方下载这些依赖项(我猜中央存储库).我的问题是,在Windows 7上,mvn在此下载阶段非确定性且经常挂起.昨天,我已经等了10个小时才能下载一个小到300-400 kbs的依赖项.有人知道如何解决这个问题或原因是什么?
谢谢,
我正在尝试为站点报告创建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) 我正在创建一个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) 我有代码,我必须为它编写 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) 我试图将我的一个Angular4项目转换为Angular7.这些是我将Angular4项目转换为Angular7所遵循的步骤.
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) java ×5
junit ×4
assert ×2
maven ×2
mc-dc ×2
unit-testing ×2
angular ×1
angular-cli ×1
arraylist ×1
assertions ×1
bytecode ×1
emma ×1
findbugs ×1
fixtures ×1
jacoco ×1
java-7 ×1
junit5 ×1
maven-2 ×1
oop ×1
refactoring ×1
validation ×1
windows ×1