테스트는 `assertions`를 포함해야 합니다.
assertions이 없는 테스트케이스는 예외가 발생하지 않도록 보장합니다. 기본적인 실행 가능성 외에도 테스트 대상 코드의 동작에 대해 아무것도 보장하지 않습니다.
이 룰은 다음과 같은 프레임워크들에서 assertions가 없는 테스트에 대하여 예외를 일으킵니다.
AssertJ
Awaitility
EasyMock
Eclipse Vert.x
Fest 1.x and 2.x
Hamcrest
JMock
JMockit
JUnit
Mockito
Rest-assured 2.x, 3.x and 4.x
RxJava 1.x and 2.x
Selenide
Spring’s org...
JUnit 테스트는 super 메소드를 호출해야 합니다.
상위 클래스 메서드를 오버라이딩하면 오버라이딩된 메서드에서 명시적인 super 호출이 수행되지 않는 한 해당 메서드가 호출되지 않습니다.
경우에 따라 super 함수를 호출하지 않는 것이 허용되지만 JUnit3의 setUp과 tearDown 함수에서 호출하지 않는 것은 허용되지 않습니다.
규칙을 어긴 코드
public class MyClassTest extends MyAbstractTestCase {
private MyClass myClass;
@Override
protected void setUp() throws Exception { // 규칙을 어긴 코드
myCla...
테스트케이스는 테스트를 포함해야 합니다.
아무런 테스트 함수가 없는 JUnit 테스트 케이스를 갖는 것은 의미가 없습니다.
마찬가지로, 테스트 파일이 없는 *Test, *Tests, *TestCase 같은 이름의 폴더를 가지고 있으면 안됩니다. 이러한 작업 중 하나를 수행하는 것은 누군가가 테스트가 없는 클래스가 테스트되었다고 생각하게 할 수 있습니다.
이 룰은 *Test, *Tests, *TestCase 같은 이름의 테스트 폴더에 파일이 없거나 아무런 테스트도 포함하지 않고 테스트케이스를 구현한 경우 알려줍니다.
지원하는 프레임워크:
JUnit3
JUnit4
JUnit5
TestNG
Zohhak
ArchUnit
Pact...
Regex 패턴들이 불필요하게 만들어져선 안됩니다.
java.util.regex.pattern.compile() 메소드는 상당한 비용이 드는 작업이므로 현명하게 사용해야 합니다.
이 방법은 더욱이 Regex을 사용하여 패턴 일치를 수행하는 데 필요한, Pattern 클래스의 인스턴스를 만드는 데 사용할 수 있는 유일한 방법입니다.
불행하게도 String.matches()이나 String.split() 같은 편리한 메소드들도 실제론 이러한 메소드 호출이 숨겨져 있을 수 있습니다.
그래서 별 이유도 없이 큰 비용을 감수해야하는 Regex 컴파일 작업을 반복하는 실수를 범하기 쉽습니다.
이 규칙은 다음과 같은 경우에 문제가 발생합니다:
Pattern에 사용되...
String은 반복문에서 '+'을 이용하여 연결 연산을 해선 안됩니다
String은 불변 객체입니다.
연결 연산이 단순히 기존 문자열의 끝에 새로운 문자열을 추가하는 방식으로 동작하지 않습니다.
loop를 반복하면서 첫 번째 String이 중간 객체 유형으로 변환되고, 두 번째 String이 연결 된 다음, 중간 객체를 다시 String으로 변환합니다.
이러한 작업의 성능은 String이 길어질수록 저하됩니다.
따라서 StringBuilder를 사용하는 것이 좋습니다.
규칙을 어긴 코드
String str = "";
for (int i = 0; i < arrayOfStrings.length ; ++i) {
str = str + arrayOfStrings[i];
}
규...
Enum 값을 갖는 Set은 EnumSet을 사용하는게 좋습니다.
Set의 모든 값이 Enum 값이라면 EnumSet을 대체해서 사용할 수 있습니다.
이 자료형은 간단한 배열을 기반으로한 자료구조를 사용하고 있기 때문에, 다른 집합들에 비해 훨씬 효율적입니다.
규칙을 어긴 코드
public class MyClass {
public enum COLOR {
RED, GREEN, BLUE, ORANGE;
}
public void doSomething() {
Set<COLOR> warm = new HashSet<COLOR>();
warm.add(COLOR.RED);
warm.add(COLOR.ORANGE);
}
}
...
어떤 String의 SubString에 존재하는 값을 찾기 위해, 원본 String을 이용하는 것이 더 좋습니다.
특정 Offset을 시작으로 하는, 하위 문자열을 만들 때 str.substring(beginIndex).indexOf(char1)과 같은 코드를 사용할 수 있습니다.
이는 잘 작동하는 방식이지만 substring 메소드 호출이 새로운 문자열을 만들게 합니다.
반복문에서 이 작업을 반복해서 실행하면 String이 아무 의미 없이 마구잡이로 생성됩니다.
그리고 str의 크기가 크다면 성능에 큰 문제가 발생될 수 있습니다.
성능 문제를 해결하려면 String.substring(beginIndex)과 다음과 같은 메서드를 혼용해서 사용해선 안 됩니다:
indexOf(int ch)
indexOf(String ...
Boxing과 Unboxing이 즉시 번복되서는 안 됩니다.
boxing은 int 같은 값을 Integer 같은 유사한 객체에 넣는 과정입니다.
unboxing은 Integer 같은 객체에서 기본 자료형 값을 찾아오는 과정입니다.
boxing과 unboxing을 하는 동안 원본 값은 변하지 않습니다.
때문에 필요하지도 않는 데 이 둘을 반복하는 것은 의미 없습니다.
이는 자동으로 boxing되거나 자동으로 unboxing되는 경우에도 적용됩니다.
(e.g Java에서 기본 자료형/래퍼 클래스 전환을 암묵적으로 처리하는 경우)
규칙을 어긴 코드
public void examineInt(int a) {
//...
}
public void examineInteger(I...
전체 글 239개, 30 페이지