#Android Test 공식 문서
=>d.android.com/training/testing
#Google Testing Blog
=>https://testing.googleblog.com
-테스트는 변경되어서는 안된다. 작업이 변경되거나 기능이 변경되지 않고 어떤 코드의 재배치 같은 게 일어나거나 새로운 기능이 추가됐다든가 기존에 있는 것들과 연관성이 없는 것들이 추가됐다든가 버그가 수정됐다든가 하는 이유들로 인해서 테스트 코드가 변경되어서는 안된다는 것이 테스트 불변성의 원칙이다. 이로인해 테스트 코드는 코드 변경이 일어나도 신뢰할 수 있는 검증 수단으로서의 역할을 할 수 있다. 예를들면은 아까까지는 테스트가 잘 이루어졌는데 갑자기 원래 코드의 다른 기능을 수정했을 때 테스트 코드가 실행되지 않는다면(이런 것들을 깨지기 쉬운 테스트라고 부른다) 테스트 불변성의 원칙에 어긋난 것이다. 만약 테스트 불변성을 잘 지켰다면 새로운 기능이 추가되도 테스트 코드의 실행에 정상적으로 수행 될 것이다.
-위의 문장이 의미하는 것은 테스트 코든느 대상 API의 사용자와 동일한 조건에서 테스트를 해야된다는 것이다. 즉, 개발자가 자기가 작성하나 코드를 테스트 할 때 외부에서 접근이 가능한 Public API를 통해서만 테스트를 수행하라는 것이다. 따라서 반드시 Public Method만 호출해야 한다.
-테스트 코드에서 사용하고 싶어서 private/protected 메서드를 public으로 변경해서 불러오면 안된다. 왜냐하면 원래 작성된 코드가 지니는 의미를 깨트리기 때문이다.
-어떤 테스트가 하나 있을 때 이 테스트의 결과를 보았을 때 테스트가 수행된 이후 상태가 어떻게 변경되었는지를 보고 테스트의 검증이 이루어져야한다. 만약 이렇게 하는 것이 아니라 또 다른 조작을 해서 테스트의 검증이 이루어지면안된다. 즉, 내가 머릿속에서 이미 테스트의 검증결과를 정해놓고 해당 결과가 나오지 않는다고 다른 헛짓거리를 하면 안된다는 의미이다.
-쉽게말하면 테스트의 대상A를 테스트 코드에서 사용했는데 만약 A에 변경이 생긴다면 테스트 코드 자체에 이상이 없는데도 테스트가 실패가 나올 수 있으니까 조심하라는 것이다. 예를들면, 데이터베이스에 풋을 했을 때 동일한 데이터를 넣었을 때 기존에는 그냥 조용히 실패하는것이였는데 해당 코드를 변경하여 예외가 발생하도록 코드를 변경하었다면 테스트 코드는 이상이 없는데도 실패한 테스트가 된다.
-정리하자면, 테스트 코드 작성과 검증 과정에서 중요한것은 테스트가 완료 된 후에 나온 실행 결과가
@Test
fun shouldCreateUsers() {
accounts.createUser("footbar")
verify(database).put("footbar")
}
-그러니까 아래와 같은 테스트 코드를 작성해줘야 한다.
@Test
fun shouldCreateUsers() {
accounts.createUser("footbar")
assertThat(accounts.getUser("footbar")).isNotNull()
}
-테스트 코드는, 테스트하고자 하는 것을 정학히 알 수 있는 정보를 모두 갖고 있어야한다. : 완결성
-테스트 코드는 불필요한 내용은 감춰야 한다. : 간결성
-완결성을 위한 정보들을 제외한 모든 불필요한 내용들은 감춰야 된다. 예를 들어 어떤 객체를 하나 만들기 위해서 parameter가 20개가 필요한데 실제로 해당 테스트코드와 연관된 것은 5개밖에 없다면 나머지 15개를 수단과 방법을 가리지 않고 감춰야 된다. 최종적으로는 테스트에 관련된 정보들만 필요할 수 있도록 해야된다. 또한, 감춰진 parameter들에 변경이 발생하더라도 테스트 코드에는 영향을 미치면 안된다. 이로서 테스트의 가독성을 높인다.
@Test
fun shouldPerformAddition() {
val calculator = Calculator(RoundingStrategy(),
"unused" , ENABLE_COSINE_FEATURE, 0.01 , calculusEngine , false)
val result = calculator.calculate(newTestCalculation())
assertThat(result).isEqualTo(5)
}
@Test
fun shouldPerformAddition() {
val calculator = newCalculator()
val result = calculator.calculate(newCalculation(2 , Operation.PLUS , 3))
assertThat(result).isEqualTo(5)
}