언어 자료구조 알고리즘/디딤돌 C++

25. 캡슐화 최종 실습 - 테스트 코드 작성

언제나휴일 2016. 1. 27. 19:58
반응형
안녕하세요. 언제나 휴일, 언휴예요.
이번에는 캡슐화 최종 실습 내용을 잘 작성했는지 확인하는 테스트 코드를 작성해 보기로 해요.

 

이제 시나리오를 보면서 테스트 코드를 작성하세요. 많은 곳에서 구현한 후에 테스트를 수행합니다. 그리고 테스트 코드도 테스트를 수행하기 바로 전에 작성하죠. 하지만 소프트웨어 테스트는 많은 신경을 써도 충분하지 않아 배포 후에 버그를 발견할 때도 많습니다.
 
소프트웨어 개발에서 잘못 작성한 것은 빨리 발견할수록 전체 비용을 줄어듭니다. 이러한 이유로 많은 연구에서 설계가 끝나면 구현 작업과 함께 시작할 것을 권하고 있습니다. 그리고 구현한 것을 빠르게 테스트를 할 수 있게 원하는 결과가 나왔는지 빠르게 판단할 수 있는 다양한 기법을 사용하고 있습니다.
 
여기에서는 테스트를 빠르게 판단할 수 있는 코드 작성에 관해서는 다루지 않습니다.
 
여러분께서 어떻게 하면 학생 클래스를 잘 정의하였는지 테스트 할 수 있는 코드를 작성한 후에 비교해 보세요. 여기에서 작성한 테스트 코드는 모든 것을 테스트 할 수 있게 작성하지 않았습니다. 그리고 빠르게 버그를 판단할 수 있게 작성한 것이 아니므로 보다 나은 테스트 방법에 관해 고민해 보세요.
 
먼저 테스트에서 학생 정보를 출력하여 상태를 확인할 수 있게 학생 정보를 출력하는 기능을 구현하세요.
void ViewStuInfo(Student *stu)
{
    cout<<"주민 번호:"<<stu->GetPN()<<" 이름:"<<stu->GetName()<<endl;
    cout<<"지력:"<<stu->GetIQ()<<" 체력:"<<stu->GetHP()<<" 스트레스:"<<stu->GetStress()<<endl;
}
 
학생의 주민번호가 순차적으로 부여하는지 확인하는 기능도 필요하겠죠.
void TestPN()
{
    Student *stu;
    cout<<"10명의 학생 생성 후 소멸(순차적으로 주민 번호 부여 테스트)"<<endl;
    for(int i = 0; i<10;i++)
    {
        stu = new Student("테스트");
        ViewStuInfo(stu);
        delete stu;
    }
    cout<<endl;
}
 
이제 기능에 따라 학생 상태를 시나리오에 맞게 바뀌는지 확인하는 코드를 작성하세요. 여기에서는 간단하게 구현하였습니다. 모든 테스트를 할 수 있는 코드나 버그를 빠르게 확인할 수 있게 작성하려면 무엇을 변경하고 추가해야 할 지 생각해 보세요.
void TestStudy()
{
    Student *stu = new Student("홍길동");
    ViewStuInfo(stu);
    cout<<"공부하다 8회 실시"<<endl;
    for(int i = 0; i<8;i++)
    {
        stu->Study();
        ViewStuInfo(stu);       
    }
    delete stu;
}
void TestEtc()
{
    Student *stu = new Student("홍길동");
    ViewStuInfo(stu);
    cout<<"공부하다 3회 실시"<<endl;
    for(int i = 0; i<3;i++)
    {
        stu->Study();
        ViewStuInfo(stu);       
    }
    cout<<"강의받다 3회 실시"<<endl;
    for(int i = 0; i<3;i++)
    {
        stu->ListenLecture();
        ViewStuInfo(stu);    
    }
    cout<<"공부하다 1회 실시"<<endl;
    stu->Study();
    ViewStuInfo(stu);
    //이하 생략
    delete stu;
}
 
다음은 이제까지 작성한 전체 코드 내용입니다.
//Student.h
#pragma once
#include <string>
using namespace std;
class Student
{
    const int pn;//주민번호
    static int last_pn;//가장 최근에 부여한 주민 번호
    string name;//이름
    int iq;//지력
    int hp;//체력
    int stress;//스트레스
    int scnt;//연속으로 공부한 횟수
   
    //능력치의 디폴트, 최소, 최대값
    static const int def_iq;
    static const int min_iq;
    static const int max_iq;
 
    static const int def_hp;
    static const int min_hp;
    static const int max_hp;
 
    static const int def_stress;
    static const int min_stress;
    static const int max_stress;
 
    static const int def_scnt;
    static const int min_scnt;
    static const int max_scnt;
public:
    Student(string name);//생성자
    void Study();//공부하다.
    void ListenLecture();//강의받다.
    void Sleep();//잠자다.
    void Relax();//휴식하다.
    void Drink();//음료마시다.
    void Sing();//노래하다.
    string GetName()const;//이름 접근자
    int GetPN()const;//주민번호 접근자
    int GetIQ()const;//지력 접근자
    int GetHP()const;//체력 접근자
    int GetStress()const;//스트레스 접근자
};
 
//Student.cpp
#include "Student.h"
 
int Student::last_pn;
const int Student::def_iq=100;
const int Student::min_iq=0;
const int Student::max_iq=200;
const int Student::def_hp=100;
const int Student::min_hp=0;
const int Student::max_hp=200;
const int Student::def_stress=0;
const int Student::min_stress=0;
const int Student::max_stress=100;
const int Student::def_scnt=0;
const int Student::min_scnt=0;
const int Student::max_scnt=5;
Student::Student(string name):pn(++last_pn)
{
}
void Student::Study()
{
}
void Student::ListenLecture()
{
}
void Student::Sleep()
{
}
void Student::Relax()
{
}
void Student::Drink()
{
}
void Student::Sing()
{
}
string Student::GetName()const
{
    return name;
}
int Student::GetPN()const
{
    return pn;
}
int Student::GetIQ()const
{
    return iq;
}
int Student::GetHP()const
{
    return hp;
}
int Student::GetStress()const
{
    return stress;
}
 
//Program.cpp
#include "Student.h"
#include <iostream>
using namespace std;
 
void ViewStuInfo(Student *stu);//학생 정보 출력
void TestPN();//순차적으로 주민 번호 부여 테스트
void TestStudy();//공부하다 테스트
void TestEtc();//나머지 테스트
int main()
{
    TestPN();//순차적으로 주민 번호 부여 테스트
    TestStudy();//공부하다 테스트
    TestEtc();//나머지 테스트
    return 0;
}
void ViewStuInfo(Student *stu)
{
    cout<<"주민 번호:"<<stu->GetPN()<<" 이름:"<<stu->GetName()<<endl;
    cout<<"지력:"<<stu->GetIQ()<<" 체력:"<<stu->GetHP()<<" 스트레스:"<<stu->GetStress()<<endl;
}
void TestPN()
{
    Student *stu;
    cout<<"10명의 학생 생성 후 소멸(순차적으로 주민 번호 부여 테스트)"<<endl;
    for(int i = 0; i<10;i++)
    {
        stu = new Student("테스트");
        ViewStuInfo(stu);
        delete stu;
    }
    cout<<endl;
}
void TestStudy()
{
    Student *stu = new Student("홍길동");
    ViewStuInfo(stu);
    cout<<"공부하다 8회 실시"<<endl;
    for(int i = 0; i<8;i++)
    {
        stu->Study();
        ViewStuInfo(stu);       
    }
    delete stu;
}
void TestEtc()
{
    Student *stu = new Student("홍길동");
    ViewStuInfo(stu);
    cout<<"공부하다 3회 실시"<<endl;
    for(int i = 0; i<3;i++)
    {
        stu->Study();
        ViewStuInfo(stu);       
    }
    cout<<"강의받다 3회 실시"<<endl;
    for(int i = 0; i<3;i++)
    {
        stu->ListenLecture();
        ViewStuInfo(stu);    
    }
    cout<<"공부하다 1회 실시"<<endl;
    stu->Study();
    ViewStuInfo(stu);
    //이하 생략
    delete stu;
}

반응형