Test할 때는 Random을 사용하자

SteadySlower·2022년 10월 7일
0
post-custom-banner

이 테스트의 단점: 특정 String에 테스트가 의존

아래 테스트를 보도록 하겠습니다. 두 번째 context 안에 있는 테스트를 보시면 viewModel.bookName에 특정한 문자열을 할당하고 있습니다. 그저 empty 여부에 따라서만 변수의 값이 정의되는 이런 간단한 테스트에서는 문제가 없지만 어떤 테스트에서는 문자열의 길이, 영문/한글 여부 등에 따라서 테스트의 결과가 달라지는 경우도 있습니다.

이런 경우에 대비해서 테스트를 할 때는 특정한 테스트를 하드 코딩으로 미리 정해진 String을 넣기 보다는 테스트를 할 때마다 매번 달라지는 랜덤 String을 넣는 것이 좋습니다.

describe("isSaveButtonUnable") {
    beforeEach {
        prepare()
    }
    context("when bookName is empty") {
        it("should be false") {
            expect(viewModel.isSaveButtonUnable).to(beTrue())
        }
    }
    context("when bookName is not empty") {
        it("shoule be true") {
            viewModel.bookName = "someBook"
            expect(viewModel.isSaveButtonUnable).to(beFalse())
        }
    }
}

랜덤 String을 만드는 함수

아래 코드는 아주 간단하게 다양한 길이의 Random String을 만드는 함수입니다. 앞으로 테스트를 하면서 많이 사용하게 될테니 따로 클래스를 만들어서 정의해두고 사용합니다.

class Random {
    
    static var string: String {
        let length = (1...100).randomElement() ?? 10
        let alphabets = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
        var result = ""
        
        for _ in 0..<length {
            let randomAlphabet = alphabets.randomElement() ?? "a"
            result += String(randomAlphabet)
        }
        
        return result
    }
    
}

랜덤 String 사용해서 수정: 테스트의 독립성 보장

test 안에서 랜덤 스트링을 사용했습니다. 이렇게 하면 테스트를 할 때마다 다른 String이 사용되게 됩니다. 따라서 테스트가 특정 String에 의존하지 않고 독립적으로 수행될 수 있게 됩니다.

describe("isSaveButtonUnable") {
    beforeEach {
        prepare()
    }
    context("when bookName is empty") {
        it("should be false") {
            expect(viewModel.isSaveButtonUnable).to(beTrue())
        }
    }
    context("when bookName is not empty") {
        it("shoule be true") {
            viewModel.bookName = Random.string
            expect(viewModel.isSaveButtonUnable).to(beFalse())
        }
    }
}
profile
백과사전 보다 항해일지(혹은 표류일지)를 지향합니다.
post-custom-banner

0개의 댓글