You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
테스트는 소프트웨어 제품이 요구 사항을 충족하고 예상대로 작동하는지 확인하는 데 도움이 되므로 소프트웨어 개발의 필수적인 부분입니다. 테스트가 필요하고 중요한 이유는 여러 가지가 있습니다:
8
+
9
+
- 소프트웨어 적응성을 확인하기 위해: 테스트는 소프트웨어가 다양한 환경과 다양한 구성에서 올바르게 작동할 수 있는지 확인합니다.
10
+
- 오류 식별: 테스트는 소프트웨어의 버그와 오류를 식별하여 제품 출시 전에 수정할 수 있도록 도와줍니다.
11
+
- 추가 비용 방지: 개발 프로세스 초기에 버그를 발견하고 수정하면 출시 후에 버그를 발견하는 것보다 시간과 비용을 절약할 수 있습니다.
12
+
- 소프트웨어 개발 가속화: 테스트를 통해 코드 변경 사항에 대한 빠른 피드백을 제공함으로써 개발 속도를 높일 수 있습니다.
13
+
- 위험 방지: 테스트는 소프트웨어 제품 사용과 관련된 잠재적 위험을 식별하는 데 도움이 됩니다.
14
+
15
+
## 테스트의 종류
16
+
17
+
단위 테스트(unit test)와 통합 테스트(integration test)는 서로 다른 목적을 가진 두 가지 테스트 유형입니다.
18
+
19
+
단위 테스트는 고립된 작은 코드 조각이 의도한 대로 작동하는지 확인하기 위한 자동화된 테스트의 한 유형입니다. 일반적으로 개발자가 개발 중에 수행하며 함수나 프로시저와 같은 개별 소프트웨어 구성 요소에 중점을 둡니다.
20
+
21
+
반면에 통합 테스트는 여러 소프트웨어 구성 요소가 함께 작동하는 방식을 테스트하는 프로세스입니다. 통합 테스트는 통합된 유닛 간의 인터페이스가 올바른지 확인하는 데 중점을 둡니다. 통합 테스트는 일반적으로 단위 테스트가 완료된 후 시스템 테스트 전에 수행됩니다.
22
+
23
+
단위 테스트와 통합 테스트의 주요 차이점은 단위 테스트는 개별 코드 단위에 초점을 맞추고 통합 테스트는 이들이 함께 작동하는 방식에 초점을 맞춘다는 점입니다. 단위 테스트는 개발자가 코드가 원자 수준에서 올바르게 작동하는지 확인하는 데 도움이 되며, 통합 테스트는 시스템의 여러 부분이 올바르게 함께 작동하는지 확인하는 데 도움이 됩니다.
`play()` 함수는 입력받은 두 카드의 값을 비교해 첫 번째 카드의 승패 유무를 리턴하는 함수입니다. 가위바위보에서 이기면 `True`, 지면 `False` , 비기면 `None` 을 리턴합니다. `stop()` 함수는 무조건 에러를 발생시켜 프로그램을 종료시킵니다.
48
+
49
+
이제 `test.py` 모듈을 보겠습니다. `@pytest.mark.parametrize` 는 테스트의 각 파라미터를 테스트 수행 중에 동적으로 넣을 수 있는 데코레이터입니다. 여기서 승, 무, 패 3가지를 테스트하는 함수 `test_win`, `test_draw`, `test_lose` 와 함께 함수 `stop()` 이 에러를 발생시키는지를 검사하는 `test_stop` 까지 총 4개의 테스트가 존재합니다.
`cargo` 에 내장된 test 러너로 유닛 테스트 실행이 가능합니다. 러스트는 테스트 파일을 별도로 만들지 않고, 같은 파일 안에 `test` 모듈을 넣어서 작성합니다. 이렇게 하면 테스트 모듈에서 대상 모듈에 대한 접근이 쉬워집니다. 다시 말해, private으로 선언된 함수에도 접근할 수 있기 때문에 테스트가 용이해집니다.
39
184
40
-
아래 명령어로 `lib.rs` 에 정의된 테스트 모듈의 테스트들을 수행합니다.
185
+
아래 명령어로 테스트 모듈의 테스트들을 수행합니다.
41
186
42
187
```bash
43
188
cargo test
@@ -68,4 +213,131 @@ test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; fini
68
213
69
214
러스트는 테스트를 위해 바이너리를 빌드하는 과정이 먼저 수행됩니다. 그리고 유닛 테스트를 수행합니다. 마지막에 "Doc-tests"라는게 추가로 수행되는데 이는 밑에서 더 자세히 설명하겠습니다.
70
215
216
+
비슷하게 클래스도 테스트할 수 있습니다. 먼저 파이썬에서 다음과 같은 클래스를 정의합니다.
217
+
218
+
```python
219
+
classPerson:
220
+
def__init__(self, name, age):
221
+
self.name = name
222
+
self._age = age
223
+
224
+
@property
225
+
defage(self):
226
+
returnself._age
227
+
228
+
defhi(self):
229
+
returnf"Hi, I'm {self.name}, I'm {self._age} years old."
230
+
231
+
```
232
+
233
+
테스트 모듈에서는 객체화를 한 다음 프로퍼티와 메소드가 잘 적용되는지를 테스트합니다.
234
+
235
+
```python
236
+
deftest_hi():
237
+
name ="John"
238
+
age =30
239
+
person = Person(name, age)
240
+
assert person.hi() ==f"Hi, I'm {name}, I'm {age} years old."
241
+
assert person.hi() ==f"Hi, I'm {person.name}, I'm {person.age} years old."
242
+
243
+
```
244
+
245
+
러스트에서는 다음과 같이 구조체를 선언했습니다. 먼저 `person` 모듈을 선언하고 그 다음 `Person` 구조체와 메소드를 정의했습니다. 여기서 별도로 모듈을 만들지 않아도 상관없습니다.
246
+
247
+
```rust,ignore
248
+
pub mod person {
249
+
250
+
pub struct Person {
251
+
pub name: String,
252
+
age: u8,
253
+
}
254
+
255
+
impl Person {
256
+
pub fn new(name: &str, age: u8) -> Person {
257
+
Person {
258
+
name: name.to_string(),
259
+
age: age,
260
+
}
261
+
}
262
+
263
+
pub fn hi(&self) -> String {
264
+
format!("Hi, I'm {}, I am {} years old.", self.name, self.age())
265
+
}
266
+
267
+
pub fn age(&self) -> u8 {
268
+
self.age
269
+
}
270
+
}
271
+
}
272
+
273
+
```
274
+
275
+
그 다음 테스트 모듈에 아래 함수를 추가합니다.
276
+
277
+
```rust,ignore
278
+
#[test]
279
+
fn test_hi() {
280
+
let name = "John";
281
+
let age: u8 = 30;
282
+
let person = person::Person::new(name, age);
283
+
assert_eq!(
284
+
person.hi(),
285
+
format!("Hi, I'm {}, I am {} years old.", name, age)
286
+
);
287
+
assert_eq!(
288
+
person.hi(),
289
+
format!("Hi, I'm {}, I am {} years old.", person.name, person.age())
290
+
);
291
+
}
292
+
```
293
+
294
+
파이썬과 마찬가지로 프로퍼티와 메소드가 잘 적용되는지를 테스트합니다. 아래 명령어로 테스트들을 수행합니다.
0 commit comments