提交 1c04c682 编写于 作者: W wizardforcel

2020-06-11 23:10:34

上级 233b4e80
......@@ -6,7 +6,7 @@
另一方面,精心设计和编写的类集可以极大地加快编码过程,同时减少比较中的错误数量。
在本教程中,我们将通过示例讨论 Java 中的 **SOLID 原则**,这是 5 种最推荐的设计原则,在编写类时应牢记。 它们还构成设计应用类时要遵循的[**最佳做法**](//howtodoinjava.com/category/best-practices/ "java best practices")
在本教程中,我们将通过示例讨论 Java 中的 **SOLID 原则**,这是 5 种最推荐的设计原则,在编写类时应牢记。 它们还构成设计应用类时要遵循的[**最佳实践**](//howtodoinjava.com/category/best-practices/ "java best practices")
```java
Table Of Contents
......
......@@ -14,11 +14,11 @@
糟糕的单元测试是现实,每个执行代码审查的人都偶尔(可能是定期)面对它。 那么,什么构成不良的测试案例呢? 如何识别不良测试案例?
#### [Java](//howtodoinjava.com/best-practices/5-class-design-principles-solid-in-java/ "5 class design principles [S.O.L.I.D.] in java") 中的 5 个类设计原则[S.O.L.I.D.]
#### [Java 中的 5 个类设计原则(S.O.L.I.D.)](//howtodoinjava.com/best-practices/5-class-design-principles-solid-in-java/ "5 class design principles [S.O.L.I.D.] in java")
在编写类时,请牢记 5 条最推荐的设计原则。 简而言之,这些设计原则称为 SOLID。
#### [单元测试最佳做法](//howtodoinjava.com/best-practices/unit-testing-best-practices-junit-reference-guide/ "Unit testing best practices : Junit Reference guide")
#### [单元测试最佳实践](//howtodoinjava.com/best-practices/unit-testing-best-practices-junit-reference-guide/ "Unit testing best practices : Junit Reference guide")
编写糟糕的单元测试非常容易,这会给项目增加很少的价值,同时又会天文数字地增加代码更改的成本。 了解如何正确编写它们。
......@@ -30,7 +30,7 @@
涵盖了一些众所周知的和鲜为人知的实践,您在处理下一个 Java 编程任务中的异常时必须考虑这些实践。
#### [Java 执行程序框架最佳做法](//howtodoinjava.com/java-5/java-executor-framework-tutorial-and-best-practices/ "Java executor framework tutorial and best practices")
#### [Java 执行器框架最佳实践](//howtodoinjava.com/java-5/java-executor-framework-tutorial-and-best-practices/ "Java executor framework tutorial and best practices")
设计下一个多线程应用时需要牢记的一些最佳实践。
......@@ -50,11 +50,11 @@
用户提供的密码通常很弱并且很容易猜到。 Java 中有许多哈希算法,这些哈希算法可以证明对您的应用和用户的密码安全非常有效。
#### [可序列化的接口指南](//howtodoinjava.com/java/serialization/a-mini-guide-for-implementing-serializable-interface-in-java/ "A mini guide for implementing serializable interface in java")
#### [`Serializable`接口指南](//howtodoinjava.com/java/serialization/a-mini-guide-for-implementing-serializable-interface-in-java/ "A mini guide for implementing serializable interface in java")
我们都知道 Serializable 接口的作用。 但是我们真的知道,您的类中有哪些更改会破坏您的设计?
我们都知道`Serializable`接口的作用。 但是我们真的知道,您的类中有哪些更改会破坏您的设计?
#### [对象初始化最佳做法](//howtodoinjava.com/java/related-concepts/object-initialization-best-practices-internal-caching-in-wrapper-classes/ "Object initialization best practices : Internal caching in wrapper classes")
#### [对象初始化最佳实践](//howtodoinjava.com/java/related-concepts/object-initialization-best-practices-internal-caching-in-wrapper-classes/ "Object initialization best practices : Internal caching in wrapper classes")
创建新对象始终是一个昂贵的过程。 让我们学习一下 Java 如何利用对象池解决此问题。
......@@ -64,33 +64,33 @@
#### [考虑在运行时重新加载 log4j 级别](//howtodoinjava.com/log4j/how-to-reload-log4j-levels-on-runtime/ "How to reload log4j levels on runtime")
了解如何使用 WatchService 在运行时重新加载日志记录配置。 也可以使用它们来重新加载其他配置。
了解如何使用`WatchService`在运行时重新加载日志记录配置。 也可以使用它们来重新加载其他配置。
#### [使用 ToStringBuilder](//howtodoinjava.com/apache-commons/how-to-override-tostring-effectively-with-tostringbuilder/ "How to override toString() effectively with ToStringBuilder") 有效覆盖 toString()
#### [使用`ToStringBuilder`有效覆盖`toString()`](//howtodoinjava.com/apache-commons/how-to-override-tostring-effectively-with-tostringbuilder/ "How to override toString() effectively with ToStringBuilder")
ToStringBuilder 是 apache commons lang 库提供的工具类。 学习使用它编写高度自定义的 toString()方法。
`ToStringBuilder`是 apache commons lang 库提供的工具类。 学习使用它编写高度自定义的`toString()`方法。
#### [在任何循环内使用数组代替 Vector.elementAt()](//howtodoinjava.com/best-practices/use-array-instead-of-vector-elementat-inside-any-loop-for-better-performance/ "Use array instead of Vector.elementAt() inside any loop for better performance")
#### [在任何循环内使用数组代替`Vector.elementAt()`](//howtodoinjava.com/best-practices/use-array-instead-of-vector-elementat-inside-any-loop-for-better-performance/ "Use array instead of Vector.elementAt() inside any loop for better performance")
从多个线程访问时,Vector 不需要额外的同步,但是由于相同的原因,它会降低其性能。 评估其影响。
从多个线程访问时,`Vector`不需要额外的同步,但是由于相同的原因,它会降低其性能。 评估其影响。
#### [在 Java 中始终使用 length()而不是 equals()来检查空字符串](//howtodoinjava.com/java/string/always-use-length-instead-of-equals-to-check-empty-string-in-java/ "Always use length() instead of equals() to check empty string in java")
#### [在 Java 中始终使用`length()`而不是`equals()`来检查空字符串](//howtodoinjava.com/java/string/always-use-length-instead-of-equals-to-check-empty-string-in-java/ "Always use length() instead of equals() to check empty string in java")
检查字符串是否为空的最好方法是使用 length()方法而不是 equals()。 为什么? 让我们做一些推理。
检查字符串是否为空的最好方法是使用`length()`方法而不是`equals()`。 为什么? 让我们做一些推理。
## 3\. Java 性能最佳实践
遵循 Java 最佳实践可以提高 Java 应用的性能并将其提升到一个新的水平。 努力学习它们并时刻牢记。
#### [不同方式迭代 HashMap 的性能比较](//howtodoinjava.com/java/related-concepts/performance-comparison-of-different-ways-to-iterate-over-hashmap/ "Performance comparison of different ways to iterate over HashMap")
#### [不同方式迭代`HashMap`的性能比较](//howtodoinjava.com/java/related-concepts/performance-comparison-of-different-ways-to-iterate-over-hashmap/ "Performance comparison of different ways to iterate over HashMap")
让我们看看迭代 HashMap 的不同方法,看看它们可以带来的性能差异。
让我们看看迭代`HashMap`的不同方法,看看它们可以带来的性能差异。
#### [Java 中不同 for 循环的性能比较](//howtodoinjava.com/java/related-concepts/performance-comparison-of-different-for-loops-in-java/ "Performance comparison of different for loops in java")
#### [Java 中不同`for`循环的性能比较](//howtodoinjava.com/java/related-concepts/performance-comparison-of-different-for-loops-in-java/ "Performance comparison of different for loops in java")
让我们比较一下不同 for 循环的效果。 它们在任何程序中无处不在。
让我们比较一下不同`for`循环的效果。 它们在任何程序中无处不在。
#### [改善 JDBC 性能的最佳做法](//howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/ "Best practices to improve JDBC performance")
#### [改善 JDBC 性能的最佳实践](//howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/ "Best practices to improve JDBC performance")
数据库访问是任何应用的主要部分。 如果您使用的是简单的 JDBC,那么这个适合您。
......
# 编写好的单元测试的第一原则
# 编写好的单元测试的 FIRST 原则
> 原文: [https://howtodoinjava.com/best-practices/first-principles-for-good-tests/](https://howtodoinjava.com/best-practices/first-principles-for-good-tests/)
......@@ -8,11 +8,11 @@
首字母缩写词 FIRST 表示以下测试功能:
* [几乎
* [隔离的
* [R]可
* [F]快速
* [I]隔离
* [R]可重复
* [S]自我验证
* [及时
* [T]及时
如果您在编写单元测试时遵循这五个原则,那么您将拥有更健壮的单元测试,从而使应用代码更稳定。
......@@ -64,14 +64,14 @@
您进行的单元测试越多,发现在进行相应的单元测试之前编写较小的代码块所付出的代价就越大。 首先,编写测试更加容易,其次,当您充实周围代码中的其余行为时,测试将立即获得回报。
## 奖金提示
## 额外提示
如果使用 Eclipse 或 IntelliJ IDEA,请考虑合并 [Infinitest](https://infinitest.github.io/) 之类的工具。 在对系统进行更改时,Infinitest 会识别并运行(在后台)任何可能受到影响的测试。
在更大范围内,您可以使用持续集成(CI)工具,例如 [Jenkins](https://jenkins.io/)[TeamCity](https://www.jetbrains.com/teamcity/) 。 CI 工具会监视您的源仓库,并在识别到更改后启动构建/测试过程。
在更大范围内,您可以使用持续集成(CI)工具,例如 [Jenkins](https://jenkins.io/)[TeamCity](https://www.jetbrains.com/teamcity/)。 CI 工具会监视您的源仓库,并在识别到更改后启动构建/测试过程。
在评论部分中,将您与 **FIRST Principles** 相关的查询发送给我。
在评论部分中,将您与 **FIRST 原则**相关的查询发送给我。
学习愉快!
> 参考:本文引用并使用了一些示例,例如 *Andy Hunt 的[“使用 JUnit 进行 Java8 中的实用单元测试”](https://pragprog.com/book/utj2/pragmatic-unit-testing-in-java-8-with-junit) 中给出的示例; 杰夫·兰格 戴夫·托马斯*。
\ No newline at end of file
> 参考:本文引用并使用了一些示例,例如 *Andy Hunt 的[“使用 JUnit 进行 Java8 中的实用单元测试”](https://pragprog.com/book/utj2/pragmatic-unit-testing-in-java-8-with-junit)中给出的示例; 杰夫·兰格,戴夫·托马斯*。
\ No newline at end of file
......@@ -2,7 +2,7 @@
> 原文: [https://howtodoinjava.com/best-practices/how-you-should-unit-test-dao-layer/](https://howtodoinjava.com/best-practices/how-you-should-unit-test-dao-layer/)
如果您正在基于 [**Spring**](//howtodoinjava.com/java-spring-framework-tutorials/ "Spring Tutorials")[**休眠**](//howtodoinjava.com/hibernate-tutorials/ "Hibernate Tutorials")[**JPA**](//howtodoinjava.com/category/frameworks/jpa/ "JPA") 构建的项目中 ,并且您想对其数据访问层(DAO)进行单元测试,那么本教程中提供的信息可能会对您有所帮助。 当我们要测试 DAO 层时,我们也需要访问数据库。 但是由于某些原因,可能会损坏测试数据(主要是为集成测试准备的),或者由于某些其他团队成员也需要访问该数据,所以可能由于某些原因而不允许您使用任何现有数据库。 为了解决此问题,我正在使用 [**内存数据库**](//howtodoinjava.com/hibernate/hibernate-4-using-in-memory-database-with-hibernate/ "Hibernate 4 : Using In-memory Database With Hibernate") 。 IM(内存中)数据库是个不错的选择,因为它不会留下任何回溯,并且您可以确保在每次测试之前都会得到空表(通常是一个好习惯)。
如果您正在基于 [**Spring**](//howtodoinjava.com/java-spring-framework-tutorials/ "Spring Tutorials")[**Hibernate**](//howtodoinjava.com/hibernate-tutorials/ "Hibernate Tutorials")[**JPA**](//howtodoinjava.com/category/frameworks/jpa/ "JPA") 构建的项目中 ,并且您想对其数据访问层(DAO)进行单元测试,那么本教程中提供的信息可能会对您有所帮助。 当我们要测试 DAO 层时,我们也需要访问数据库。 但是由于某些原因,可能会损坏测试数据(主要是为集成测试准备的),或者由于某些其他团队成员也需要访问该数据,所以可能由于某些原因而不允许您使用任何现有数据库。 为了解决此问题,我正在使用[**内存数据库**](//howtodoinjava.com/hibernate/hibernate-4-using-in-memory-database-with-hibernate/ "Hibernate 4 : Using In-memory Database With Hibernate") 。 IM(内存中)数据库是个不错的选择,因为它不会留下任何回溯,并且您可以确保在每次测试之前都会得到空表(通常是一个好习惯)。
![Unit-test-dao-layer](img/adb2235b58af10da70a942cb74fa1bf5.png)
......@@ -22,7 +22,7 @@ Table of Contents
例如。 在主应用中,如果配置文件为`application-context.xml`,则应创建另一个文件`application-context-test.xml`,然后将原始配置导入到该文件的顶部。 然后覆盖您可能需要的 Bean 定义(例如,使用内存数据库而不是常规数据库)。
**application-context-test.xml**
**`application-context-test.xml`**
```java
......@@ -49,7 +49,7 @@ Table of Contents
```
**application-context.xml**
**`application-context.xml`**
```java
<beans xmlns="http://www.springframework.org/schema/beans"
......@@ -103,7 +103,7 @@ Table of Contents
## 2)编写 DAO 层的单元测试
下一部分将编写 [**junit**](//howtodoinjava.com/junit/ "JUnit Tutorials") (或任何其他框架)测试用例。 我正在使用[Spring 测试](https://docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html "spring test")模块。 您可以按照以下方式编写测试用例。
下一部分将编写 [**junit**](//howtodoinjava.com/junit/ "JUnit Tutorials")(或任何其他框架)测试用例。 我正在使用 [Spring 测试](https://docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html "spring test")模块。 您可以按照以下方式编写测试用例。
```java
package com.jpa.demo.test;
......@@ -195,7 +195,7 @@ public class TestEmployeeDAO
```
3. 使用@Rollback(true)注解可恢复原始数据库状态。
3. 使用`@Rollback(true)`注解可恢复原始数据库状态。
```java
@Test
......@@ -208,23 +208,23 @@ public class TestEmployeeDAO
```
4. Always create some data in a testcase, and verify that data in same testcase. Never make one testcase depedent on other testcase. You may want to read some unit testing best practices and guidelines in below posts.
4. 始终在测试用例中创建一些数据,并在同一测试用例中验证该数据。 切勿在另一个测试用例上使用一个测试用例。 您可能需要阅读以下文章中的一些单元测试最佳实践和准则。
> **阅读更多:[单元测试最佳做法](//howtodoinjava.com/best-practices/unit-testing-best-practices-junit-reference-guide/ "Unit testing best practices : Junit Reference guide")**
> **阅读更多:[单元测试最佳实践](//howtodoinjava.com/best-practices/unit-testing-best-practices-junit-reference-guide/ "Unit testing best practices : Junit Reference guide")**
## 3)包结构
## 3)包结构
最后,看一下此示例中使用的项目结构。 注意,`application-context-test.xml`位于`test/resources`文件夹中。
![Package Structure](img/3feb49fe764c30c86b7b70a8c74b2324.png)
Package Structure
包结构
现在查看我为本教程编写的其他文件。
**log4j.properties**
**`log4j.properties`**
```java
log4j.logger.org.hibernate=INFO, hb
......@@ -234,7 +234,7 @@ log4j.appender.hb.layout=org.apache.log4j.PatternLayout
```
**DepartmentEntity.java**
**`DepartmentEntity.java`**
```java
package com.howtodoinjava.jpa.demo.entity;
......@@ -281,7 +281,7 @@ public class DepartmentEntity implements Serializable {
```
**EmployeeEntity.java**
**`EmployeeEntity.java`**
```java
package com.howtodoinjava.jpa.demo.entity;
......@@ -333,7 +333,7 @@ public class EmployeeEntity implements Serializable
```
**DepartmentDAO.java**
**`DepartmentDAO.java`**
```java
package com.howtodoinjava.jpa.demo.dao;
......@@ -352,7 +352,7 @@ public interface DepartmentDAO
```
**DepartmentDAOImpl.java**
**`DepartmentDAOImpl.java`**
```java
package com.howtodoinjava.jpa.demo.dao;
......@@ -420,7 +420,7 @@ public class DepartmentDAOImpl implements DepartmentDAO {
```
**EmployeeDAO.java**
**`EmployeeDAO.java`**
```java
package com.howtodoinjava.jpa.demo.dao;
......@@ -440,7 +440,7 @@ public interface EmployeeDAO
```
**EmployeeDAOImpl.java**
**`EmployeeDAOImpl.java`**
```java
package com.howtodoinjava.jpa.demo.dao;
......@@ -515,7 +515,7 @@ public class EmployeeDAOImpl implements EmployeeDAO {
```
**pom.xml**
**`pom.xml`**
```java
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
......@@ -669,7 +669,7 @@ public class EmployeeDAOImpl implements EmployeeDAO {
```
[**JPAExamples**](//howtodoinjava.com/wp-content/uploads/2015/04/JPAExamples.zip)
[**JPA 示例**](//howtodoinjava.com/wp-content/uploads/2015/04/JPAExamples.zip)
随时给我您的疑问和建议。
......
......@@ -2,7 +2,7 @@
> 原文: [https://howtodoinjava.com/best-practices/unit-testing-best-practices-junit-reference-guide/](https://howtodoinjava.com/best-practices/unit-testing-best-practices-junit-reference-guide/)
我假设您了解 [JUnit](http://junit.org/junit4/ "junit") 的基础知识。 如果您没有基础知识,请首先阅读 (已针对 JUnit 5 更新)。 现在,我们将介绍在编写测试用例时必须考虑的 **junit [最佳实践](//howtodoinjava.com/java-best-practices/ "best practices")**
我假设您了解 [JUnit](http://junit.org/junit4/ "junit") 的基础知识。 如果您没有基础知识,请首先阅读(已针对 JUnit 5 更新)。 现在,我们将介绍在编写测试用例时必须考虑的 **junit [最佳实践](//howtodoinjava.com/java-best-practices/ "best practices")**
> 编写糟糕的单元测试非常容易,这会给项目增加很少的价值,同时又会天文数字地增加代码更改的成本。
......@@ -34,7 +34,7 @@ Tips for writing great unit tests
Summary
```
在编程中,“ [**单元测试**](https://en.wikipedia.org/wiki/Unit_testing "Unit testing") 是一种测试源代码的各个单元以确定它们是否适合使用的方法。” 现在,这个源代码单元可以在不同的情况下使用。
在编程中,“[**单元测试**](https://en.wikipedia.org/wiki/Unit_testing "Unit testing")是一种测试源代码的各个单元以确定它们是否适合使用的方法。” 现在,这个源代码单元可以在不同的情况下使用。
例如:在[过程编程](https://en.wikipedia.org/wiki/Procedural_programming "Procedural programming")中,一个单元可以是一个完整的模块,但更常见的是一个单独的功能或过程。 在[面向对象编程](https://en.wikipedia.org/wiki/Object-oriented_programming "Object-oriented_programming")中,一个单元通常是一个完整的接口,例如一个类,但可以是一个单独的方法。 直观上,应该将一个单元视为应用中最小的可测试部分。
......@@ -44,7 +44,7 @@ Summary
**因此,如果您要查找回归错误,则实际上一起运行整个应用**会更有效,因为它将在生产环境中运行,就像[手动测试](https://en.wikipedia.org/wiki/Manual_testing "Manual testing") 。 如果您将这种测试自动化以检测将来发生的破损,则称为[集成测试](https://en.wikipedia.org/wiki/Integration_testing "Integration testing"),通常使用与单元测试不同的技术。
> “从本质上讲,单元测试应该被视为设计过程的一部分,因为它是 TDD( [**测试驱动开发**](https://en.wikipedia.org/wiki/Test-driven_development "Test-driven_development") )中的一部分。” 这应该用于支持设计过程,以便设计人员可以识别系统中的每个最小模块并分别进行测试。
> “从本质上讲,单元测试应该被视为设计过程的一部分,因为它是 TDD([**测试驱动开发**](https://en.wikipedia.org/wiki/Test-driven_development "Test-driven_development"))中的一部分。” 这应该用于支持设计过程,以便设计人员可以识别系统中的每个最小模块并分别进行测试。
## 编写出色的单元测试的提示
......@@ -54,7 +54,7 @@ Summary
1. *第一个参数可以为空。 它应该抛出无效的参数异常。*
2. *第二个参数可以为空。 它应该抛出无效的参数异常。*
3. *两者都可以为 null。 它应该抛出无效的参数异常。*
3. *两者都可以为。 它应该抛出无效的参数异常。*
4. *最后,测试功能的有效输出。 它应该返回有效的预定输出。*
当您进行了一些代码更改或重构,然后测试功能没有损坏时,这将很有帮助,运行测试用例就足够了。 同样,如果您更改任何行为,则需要更改单个或最少数量的测试用例。
......@@ -69,7 +69,7 @@ Summary
不要制作单元测试用例链。 这将阻止您确定测试用例失败的根本原因,并且您将不得不调试代码。 同样,它会创建依赖关系,这意味着如果您必须更改一个测试用例,那么您就不必要在多个测试用例中进行更改。
尝试对所有测试用例使用 [**@Before**](http://junit.sourceforge.net/javadoc/org/junit/Before.html "Junit @Before annotation")[**@After**](http://junit.sourceforge.net/javadoc/org/junit/After.html "junit @After annotation") 方法。 如果您需要多种支持@Before 或@After 中的不同测试用例的方法,请考虑创建新的 Test 类。
尝试对所有测试用例使用[**`@Before`**](http://junit.sourceforge.net/javadoc/org/junit/Before.html "Junit @Before annotation")[**`@After`**](http://junit.sourceforge.net/javadoc/org/junit/After.html "junit @After annotation")方法。 如果您需要多种支持`@Before``@After`中的不同测试用例的方法,请考虑创建新的`Test`类。
#### 4.模拟所有外部服务和状态
......@@ -102,7 +102,7 @@ Summary
#### 7.首先编写对依赖关系最少的方法的测试,然后逐步进行
该原则表明,如果要测试 Employee 模块,则应该首先测试 Create Employee 模块,因为它对外部测试用例的依赖项最小。 一旦完成,就开始编写 Modify Employee 测试用例,因为它们需要一些雇员在数据库中。
该原则表明,如果要测试`Employee`模块,则应该首先测试`Employee`模块的创建,因为它对外部测试用例的依赖项最小。 一旦完成,就开始编写`Employee`修改的测试用例,因为它们需要一些雇员在数据库中。
要在数据库中拥有一些员工,您的创建员工测试用例必须先通过,然后才能继续。 这样,如果员工创建逻辑中存在一些错误,则可以更早地发现它。
......@@ -116,7 +116,7 @@ Summary
#### 10.创建针对异常的单元测试
如果某些测试用例希望从应用中抛出 [**异常**](//howtodoinjava.com/best-practices/best-practices-for-for-exception-handling/ "Best practices for Exception handling") ,请使用“ **Expected** ”属性。 尝试避免在 catch 块中捕获异常,并使用 fail /或 asset 方法结束测试。
如果某些测试用例希望从应用中抛出[**异常**](//howtodoinjava.com/best-practices/best-practices-for-for-exception-handling/ "Best practices for Exception handling"),请使用“`Expected`”属性。 尝试避免在`catch`块中捕获异常,并使用`fail``asset`方法结束测试。
```java
@Test(expected=SomeDomainSpecificException.SubException.class)
......@@ -125,7 +125,7 @@ Summary
#### 11.使用最合适的断言方法
每个测试用例都可以使用许多 assert 方法。 运用最适当的理由和思想。 他们在那里是有目的的。 尊敬他们。
每个测试用例都可以使用许多断言方法。 运用最适当的理由和思想。 他们在那里是有目的的。 尊敬他们。
#### 12.以正确的顺序放置断言参数
......@@ -145,7 +145,7 @@ Summary
#### 16.不要写自己的只能使测试失败的 catch 块
如果测试代码中的任何方法引发某些异常,则不要编写 catch 块只是为了捕获异常并使测试用例失败。 而是在测试用例声明本身中使用 throws Exception 语句。 我将建议使用 Exception 类,并且不要使用 Exception 的特定子类。 这也将增加测试范围。
如果测试代码中的任何方法引发某些异常,则不要编写`catch`块只是为了捕获异常并使测试用例失败。 而是在测试用例声明本身中使用`throws Exception`语句。 我将建议使用`Exception`类,并且不要使用`Exception`的特定子类。 这也将增加测试范围。
#### 17.不要依赖间接测试
......@@ -157,7 +157,7 @@ Summary
#### 19.不要跳过单元测试
如果某些测试用例现在无效,则将其从源代码中删除。 不要使用 [**@忽略**](http://junit.sourceforge.net/javadoc/org/junit/Ignore.html "Junit @Ignore annotation")**svn.test.skip** 来跳过它们的执行。 在源代码中包含无效的测试用例不会帮助任何人。
如果某些测试用例现在无效,则将其从源代码中删除。 不要使用[**`@Ignore`**](http://junit.sourceforge.net/javadoc/org/junit/Ignore.html "Junit @Ignore annotation")`svn.test.skip`来跳过它们的执行。 在源代码中包含无效的测试用例不会帮助任何人。
#### 20.使用 XML 格式器捕获结果
......
# 不良单元测试用例的 8 个迹象
# 不良单元测试用例的 8 个迹象
> 原文: [https://howtodoinjava.com/best-practices/8-signs-of-bad-unit-test-cases/](https://howtodoinjava.com/best-practices/8-signs-of-bad-unit-test-cases/)
如果您从事软件开发已有很长时间,那么您可以轻松地与单元测试的重要性联系起来。 专家说,如果我们遵循这些 [**最佳实践来编写单元测试**](//howtodoinjava.com/best-practices/unit-testing-best-practices-junit-reference-guide/ "Unit testing best practices : Junit Reference guide") ,那么大多数错误都可以在单元测试阶段本身捕获,并最终传递给质量团队。
如果您从事软件开发已有很长时间,那么您可以轻松地与单元测试的重要性联系起来。 专家说,如果我们遵循这些[**最佳实践来编写单元测试**](//howtodoinjava.com/best-practices/unit-testing-best-practices-junit-reference-guide/ "Unit testing best practices : Junit Reference guide"),那么大多数错误都可以在单元测试阶段本身捕获,并最终传递给质量团队。
```java
"It's overwhelmingly easy to write bad unit tests that add very little value to a project while
inflating the cost of code changes astronomically."
```
“编写糟糕的单元测试极其容易,这给项目增加了很少的价值,同时又天文数字地增加了代码更改的成本。”
虽然,糟糕的单元测试是现实,并且每个进行代码审查的人都偶尔(可能是定期)面对它。 那么,什么构成不良的测试案例呢? 如何识别不良测试案例?
......@@ -28,7 +25,7 @@ Test filling log files with load of texts
![bad unit test cases](img/286b9841e9595a53ec317e274fabd3d4.png "bad unit test cases")
8 signs of bad unit test cases
8 个不良单元测试用例的迹象
......@@ -50,17 +47,17 @@ Test filling log files with load of texts
好吧,请注意,我不鼓励在每个测试用例中使用单个断言。 要测试单个实体,您可能需要使用多个断言,并根据需要执行。
例如,一个 API 在帖子主体中采用一些参数并创建 Employee 对象并作为响应返回。 此 Employee 对象可以具有多个字段,例如名字,姓氏,地址等。编写一个测试用例以仅验证名字,然后编写一个用于验证姓氏和另一个用于地址的测试用例是代码的重复性,而没有任何值。 不要做
例如,一个 API 在帖子主体中采用一些参数并创建`Employee`对象并作为响应返回。 此`Employee`对象可以具有多个字段,例如名字,姓氏,地址等。编写一个测试用例以仅验证名字,然后编写一个用于验证姓氏和另一个用于地址的测试用例是代码的重复性,而没有任何值。 不要做
而是编写一个用于创建员工的肯定测试用例,并验证该单元测试中的所有字段。 在这种情况下,负测试用例应单独编写,仅做一件事和一个断言。 例如,一个测试用例用于空白的名字,一个测试用例用于无效的名字,依此类推。 可以使用单个断言来验证所有此类否定测试用例,这些断言可以期望 [**响应中出现异常**](//howtodoinjava.com/junit/junit-testcases-which-expects-exception-on-runtime/ "Junit testcases which expects exception on runtime")
而是编写一个用于创建员工的肯定测试用例,并验证该单元测试中的所有字段。 在这种情况下,负测试用例应单独编写,仅做一件事和一个断言。 例如,一个测试用例用于空白的名字,一个测试用例用于无效的名字,依此类推。 可以使用单个断言来验证所有此类否定测试用例,这些断言可以期望[**响应中出现异常**](//howtodoinjava.com/junit/junit-testcases-which-expects-exception-on-runtime/ "Junit testcases which expects exception on runtime")
## 4)使用反射测试访问被测者
这真是太糟糕了。 尝试将测试对象更改为需要的用户。 在测试对象上进行代码重构时会发生什么。 测试用例会爆炸。 请勿使用或允许使用。
## 5)测试 swalloing 异常
## 5)测试被吞的异常
我得到了这些测试用例的应有份额。 在测试用例结束时,他们以小小的 catch 块静默地吞下了异常。 更糟糕的是,它们也不会发出失败的警报。 异常是您的应用抛出的信号,以表明发生了某些不良情况,您必须对其进行调查。 您不应允许测试用例忽略这些信号。
我得到了这些测试用例的应有份额。 在测试用例结束时,他们以小小的`catch`块静默地吞下了异常。 更糟糕的是,它们也不会发出失败的警报。 异常是您的应用抛出的信号,以表明发生了某些不良情况,您必须对其进行调查。 您不应允许测试用例忽略这些信号。
每当您看到意外的异常时,请立即使测试用例失败。
......
......@@ -2,7 +2,7 @@
> 原文: [https://howtodoinjava.com/best-practices/java-exception-handling-best-practices/](https://howtodoinjava.com/best-practices/java-exception-handling-best-practices/)
这篇博文是此博客中 [**最佳做法**](//howtodoinjava.com/category/best-practices/ "java best practices") 系列的又一篇文章。 在这篇文章中,我将介绍一些众所周知的和鲜为人知的实践,您在处理下一个 Java 编程任务中的异常时必须考虑这些实践。 单击此链接以阅读有关 Java 中 [**异常处理**](//howtodoinjava.com/category/java/exception-handling/ "exception handling") 的更多信息。
这篇博文是此博客中 [**最佳实践**](//howtodoinjava.com/category/best-practices/ "java best practices") 系列的又一篇文章。 在这篇文章中,我将介绍一些众所周知的和鲜为人知的实践,您在处理下一个 Java 编程任务中的异常时必须考虑这些实践。 单击此链接以阅读有关 Java 中 [**异常处理**](//howtodoinjava.com/category/java/exception-handling/ "exception handling") 的更多信息。
```java
Table of Contents
......
......@@ -14,7 +14,7 @@ Python 是一种流行的编程语言,由 Guido van Rossum 创建,并于 199
*编译语言*是指使用编译器事先将源代码编译为可执行指令的语言(例如 Java)。 以后,这些符合条件的指令可以由运行时环境执行。
*解释语言*是不应用中间编译步骤并且可以将源代码直接提供给运行时环境的语言。 在此,*源代码到机器代码的转换*在执行程序的同时发生。
*解释语言*是不应用中间编译步骤并且可以将源代码直接提供给运行时环境的语言。 在此,*源代码到机器代码的转换*在执行的同时发生。
意味着,任何用 python 编写的源代码都可以直接执行而无需编译。
......
......@@ -2,7 +2,7 @@
> 原文: [https://howtodoinjava.com/struts2/spring-4-struts-2-hibernate-integration-tutorial/](https://howtodoinjava.com/struts2/spring-4-struts-2-hibernate-integration-tutorial/)
以前,我已经介绍了 [**Spring3 +休眠集成**](//howtodoinjava.com/spring/spring-orm/spring-3-and-hibernate-integration-tutorial-with-example/ "Spring3 and hibernate integration tutorial with example") 示例和 [**struts 2 hello world**](//howtodoinjava.com/struts-2/struts-2-hello-world-example-application/ "Struts 2 hello world example application") 示例。 在本教程中,我将讨论将 spring 框架与 Struts 和 Hibernate 结合使用时要记住的所有重要点。 另外,请注意,本教程使用了其他次要但很重要的概念,例如日志记录,TLD 的使用和事​​务以及已集成到本教程中。 因此,请记住还要检查其详细信息。
以前,我已经介绍了 [**Spring3 +Hibernate集成**](//howtodoinjava.com/spring/spring-orm/spring-3-and-hibernate-integration-tutorial-with-example/ "Spring3 and hibernate integration tutorial with example") 示例和 [**struts 2 hello world**](//howtodoinjava.com/struts-2/struts-2-hello-world-example-application/ "Struts 2 hello world example application") 示例。 在本教程中,我将讨论将 spring 框架与 Struts 和 Hibernate 结合使用时要记住的所有重要点。 另外,请注意,本教程使用了其他次要但很重要的概念,例如日志记录,TLD 的使用和事​​务以及已集成到本教程中。 因此,请记住还要检查其详细信息。
在本教程中,我将使用简单的功能(例如全部获取,添加和删除)来构建员工管理屏幕。 它看起来像这样:
......@@ -353,9 +353,9 @@ public class EmployeeManagerImpl implements EmployeeManager
## 3)Spring + Hibernate 集成
现在我们必须将休眠集成到应用中。 最好的地方是利用 Spring 的强大功能进行集成,以充分利用依赖注入来与不同的 ORM 一起使用。
现在我们必须将Hibernate集成到应用中。 最好的地方是利用 Spring 的强大功能进行集成,以充分利用依赖注入来与不同的 ORM 一起使用。
上面 **beans.xml** 文件中已经给出了 Spring 所需的休眠依赖关系。 您将需要的其他文件是:
上面 **beans.xml** 文件中已经给出了 Spring 所需的Hibernate依赖关系。 您将需要的其他文件是:
**hibernate.cfg.xml**
......
......@@ -20,7 +20,7 @@
* [核心 Java 面试问题 – 第 2 部分](//howtodoinjava.com/java/interviews-questions/core-java-interview-questions-series-part-2/)
* [核心 Java 面试问题 – 第 3 部分](//howtodoinjava.com/java/interviews-questions/core-java-interview-questions-series-part-3/)
#### 1.2 [对象初始化最佳做法](//howtodoinjava.com/java/related-concepts/object-initialization-best-practices-internal-caching-in-wrapper-classes/)
#### 1.2 [对象初始化最佳实践](//howtodoinjava.com/java/related-concepts/object-initialization-best-practices-internal-caching-in-wrapper-classes/)
在 Java 中,**对象初始化**被认为是一个繁重的过程,您应该了解每个新创建的对象如何影响内存和应用性能。 一个简单的例子是 Java 包装器类,它从外部看起来很简单,就像**原始类型**一样,但是它们并不像它们看起来那么简单。 了解 Java 如何在包装类(例如`Double``Long``Integer`)内对对象进行内部缓存。
......@@ -204,11 +204,11 @@ Java 中的对象**克隆**并非易事。 我自己花了很长时间了解 Jav
在并发 Java 应用中,创建线程是一项昂贵的操作。 而且,如果您每次都开始创建新的线程实例来执行任务,则应用性能肯定会降低。 ThreadPoolExecutor 解决了此问题。
ThreadPoolExecutor 将任务创建和执行分开。 使用 ThreadPoolExecutor,您仅需实现 Runnable 对象并将其发送给执行程序。 它负责它们的执行,实例化以及使用必要的线程运行。
ThreadPoolExecutor 将任务创建和执行分开。 使用 ThreadPoolExecutor,您仅需实现 Runnable 对象并将其发送给执行。 它负责它们的执行,实例化以及使用必要的线程运行。
阅读 ThreadPoolExecutor 如何解决各种问题以及如何与 [BlockingQueue](https://howtodoinjava.com/java/multi-threading/how-to-use-blockingqueue-and-threadpoolexecutor-in-java/) 一起使用。
#### 2.7 [Java 执行程序框架教程和最佳实践](//howtodoinjava.com/java-5/java-executor-framework-tutorial-and-best-practices/ "Java executor framework tutorial and best practices")
#### 2.7 [Java 执行框架教程和最佳实践](//howtodoinjava.com/java-5/java-executor-framework-tutorial-and-best-practices/ "Java executor framework tutorial and best practices")
您将在上一个链接中学习执行器,但是要想有效地使用这些执行器,您需要了解某些事情。
......@@ -222,9 +222,9 @@ ThreadPoolExecutor 将任务创建和执行分开。 使用 ThreadPoolExecutor
## 3.有经验的开发人员的 Java 面试问题
#### 3.1 [最佳做法指南](//howtodoinjava.com/java-best-practices/ "Best practices")
#### 3.1 [最佳实践指南](//howtodoinjava.com/java-best-practices/ "Best practices")
强烈推荐的最佳做法列表。 他们将打开您的思路,朝着不同的方向思考。 简而言之,他们将为您的下一次 Java 面试提供帮助。
强烈推荐的最佳实践列表。 他们将打开您的思路,朝着不同的方向思考。 简而言之,他们将为您的下一次 Java 面试提供帮助。
#### 3.2 [结识一些难题](//howtodoinjava.com/category/puzzles/ "Puzzles")
......
......@@ -59,7 +59,7 @@ Java 规范说 Java 中的 ***都是按值传递*** 。 在 Java 中,没有“
## finally 块的用途是什么? Java 中的 finally 块是否可以保证被调用? 最终何时不调用块?
`try`块退出时,`finally`块总是执行。 这样可以确保即使发生意外异常也执行`finally`块。 但是`finally`不仅可以用于异常处理,还可以使清除代码意外地被`return``continue``break`绕过。 将清除代码放在`finally`块中始终是一个好习惯,即使没有例外的情况也是如此。
`try`块退出时,`finally`块总是执行。 这样可以确保即使发生意外异常也执行`finally`块。 但是`finally`不仅可以用于异常处理,还可以使清除代码意外地被`return``continue``break`绕过。 将清除代码放在`finally`块中始终是一个好习惯,即使没有异常的情况也是如此。
如果在执行`try``catch`代码时退出 JVM,则`finally`块可能不会执行。 同样,如果执行`try``catch`代码的线程被中断或杀死,则即使整个应用继续运行,`finally`块也可能不会执行。
......
......@@ -55,7 +55,7 @@ sleep()是一种用于将进程保留几秒钟或所需时间的方法,但是
主要区别在于,wait()释放锁定或监视器,而 sleep()不在等待期间释放任何锁或监视器。 通常,“等待”用于线程间通信,而“睡眠”用于引入执行暂停。
Thread.sleep()在一段时间内将当前线程发送到“不可运行”状态。 该线程将保留其已获取的监视器 - 即,如果该线程当前处于同步块或方法中,则其他线程无法进入该块或方法。 如果另一个线程调用 t.interrupt(),它将唤醒睡眠线程。 请注意,sleep 是一种静态方法,这意味着它始终会影响当前线程(正在执行 sleep 方法的线程)。 一个常见的错误是调用 t.sleep(),其中 t 是一个不同的线程。 即使这样,当前线程仍将休眠,而不是 t 线程。
Thread.sleep()在一段时间内将当前线程发送到“不可运行”状态。 该线程将保留其已获取的监视器 - 即,如果该线程当前处于同步块或方法中,则其他线程无法进入该块或方法。 如果另一个线程调用 t.interrupt(),它将唤醒睡眠线程。 请注意,sleep 是一种静态方法,这意味着它始终会影响当前线程(正在执行 sleep 方法的线程)。 一个常见的错误是调用 t.sleep(),其中 t 是一个不同的线程。 即使这样,当前线程仍将Hibernate,而不是 t 线程。
object.wait()将当前线程发送到“ Not Runnable”状态,就像 sleep()一样,但要稍加调整。 Wait 是在对象而不是线程上调用的; 我们将此对象称为“锁定对象”。 在调用 lock.wait()之前,当前线程必须在锁对象上进行同步。 然后,wait()释放此锁定,并将线程添加到与该锁定关联的“等待列表”。 稍后,另一个线程可以在同一个锁对象上同步并调用 lock.notify()。 这将唤醒原始的等待线程。 基本上,wait()/ notify()就像 sleep()/ interrupt()一样,仅活动线程不需要直接指针指向睡眠线程,而仅需要指向共享锁对象的指针。
......
......@@ -11,7 +11,7 @@
1. 您提出的问题的答案范围非常广。 我建议集中精力于简历中的内容……显然。
2. 接下来,关注[设计模式](//howtodoinjava.com/gang-of-four-java-design-patterns/)。 完美准备 3-4 种图案。 准备给**现实生活中的示例**,以及如何在以前的项目中使用它们。 他们一定会问这个问题。
3. 接下来,了解有关当前项目的每个细节。 系统设计,模块设计,数据库结构..以及它们提供的总体好处。 一切都放在指尖上。
4. 学习和练习多线程(特别是[执行程序](//howtodoinjava.com/java/multi-threading/java-thread-pool-executor-example/)**线程池**)。 在纸上创建一些程序。 练习一下。
4. 学习和练习多线程(特别是[执行](//howtodoinjava.com/java/multi-threading/java-thread-pool-executor-example/)**线程池**)。 在纸上创建一些程序。 练习一下。
5. 尝试编写一些棘手的 [**SQL 查询**](//howtodoinjava.com/misc/sql-query-to-find-find-the-nth-highest-salary-of-an-employee/) 等。了解联接,索引及其语法。
6. 您也应该期待 [**OOP 概念**](//howtodoinjava.com/category/object-oriented/) 。 准备自己的定义并记住。
7. 我认为,其余的都是您将在简历中提及的技术。
......
......@@ -160,7 +160,7 @@ public final class DiskFileManager
## 添加`StreamEater`
因此,我们已经添加了一个 bash 脚本和一个用于运行脚本的执行程序代码。 您必须编写自己的线程才能在执行程序上方定期运行。
因此,我们已经添加了一个 bash 脚本和一个用于运行脚本的执行器代码。 您必须编写自己的线程才能在执行器上方定期运行。
现在,我们将研究`StreamEater`,它实际上收集命令输出并提供给您的应用代码,因此应用可以记录它或执行所需的任何操作。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册