본문 바로가기
개발공부하며 느낀 인생 공부

테스트 코드짤때 각기 다른 경우 값의 변수는 어디에? [220620 TIL]

by 날파리1 2022. 6. 20.

오늘은 내가 보려고 올리는 TIL

테스트코드에서 매번 다른 케이스 변수는 어디에 넣나? 식 위치는?

코딩도장에서 받은 문제를 테스트 코드를 짜서 푸는 식으로 하라고 할 때 마다

public static void main(String[] args) {

HellowWorld application = new HellowWorld();

application.run();

 

public void run() {

 

}

항상 이렇게 시스템 가동하듯이 했는데 그러니까 문제가 

1. 테스트코드에서 작동하는 식은 테스트 코드 안에서 만드는가? run 메소드 안에서 만드는가?

2. 테스트코드를 검증하기 위한 변수는 선언을 해주나? 선언을 해준다면 어디서? 원래 페이지 메소드에서? 테스트 코드에서?

라는 의문이 있었는데 그 의문이 벌써 2번째다. 그래서 동료한테 물어봤다. 그래서 3번 물어보기 전에 정리해놓으려고 한다.

 

일단 코딩도장 풀때는 

public static void main(String[] args) {

HellowWorld application = new HellowWorld();

application.run();

 

public void run() {

 

이 과정이 필요없다. 그냥 작동하는지만 알면 되기 때문에

 

1번에 대한 답은 그냥 첫  페이지에서 해당하는 식을 짜고 테스트 코드를 켜서 

해당 클래스를 불러온다. 그리고 assertEqual(기댓값, 실제값)으로 테스트를 해준다.

 

2번

해당 함수? 식을 실행 시킬때 각각 넣어야하는 변수들은 실제값 위치에 직접 입력해준다. 왜 이걸 여태 밖에서 하나하나 선언해주려했을까.그러다보니 a = 1 인 경우 a =2 인 경우 두 가지 경우를 테스트 해야하는데 동시에 값을 넣어주니 테스트 두가지가 둘 다 통과될리가 없어서 멘붕이었다.

예를 들면 이런식

assertEquals(기댓값, method(1));

assertEquals(기댓값, method(2));

 

다시 오늘 푼 간단 식으로 이해하면 (식 관련 문제는 int[] {1,2,3,4} 와 같은 주어진 배열 값의 평균을 구하는 것이었다.)

메인 페이지는

public class AverageSolution {

  double average(int[] array) {

    double divider = array.length;
    double sum = 0;

    for (int i = 0; i < divider; i += 1) {
      sum += array[i];
    }

    return sum / divider;
  }
}

테스트 코드 페이지는

class AverageSolutionTest {
  @Test
  void simpleCase1() {

  AverageSolution averageSolution = new AverageSolution();


  assertEquals(2.5,averageSolution.average(new int[] {1,2,3,4}));
  assertEquals(5,averageSolution.average(new int[] {5,5}));

  }

}

배운 점

항상 뭔가 알듯말듯해서 더 답답하고 그러다 시간만 보내는 경우가 많았는데 이렇게 정리하면서 다음에 어떤 액션을 취해야할지가 명확해졌다. 지금 내 나름대로 정리한 글이 내가 아직 왕와아아오오쿠오아ㅏ앙슈우웅 초보라서 맞지 않는 경우가 많겠지만 일단 내가 배운데까지는 저렇게 정의하는데 문제가 없는 것 같다.(똑바로 정확히 모든 것을 아는 것도 중요하지만 초,중수는 그것이 불가능하기 때문에 자기 레벨까지 경험치 삼아 나름의 정의를 내린 후 논리에 반대되는 예외 케이스를 접할때 예외 케이스를 공부하고 다시 쌓은 논리에 수정하거나 추가하는게 맞다고 본다.)

1. 테스트코드 짤 떄 계산하는 함수식 넣을 위치

2. 각각 변수값다른 경우 변수 어디에 넣는지  를 알았다.

 

해볼 것

사실 오늘 메소드,필드,객체,클래스에 대해 어렴풋이 알게되어서 정의를 내리려고 했는데 그렇게 애매하게 정의내리기 싫어 조사를 하면 정말 2,3시간이 지나도 정리를 못할 것 같아서 쉬우면서도 머릿속이 탁 풀린 주제로 골랐다. 내일은 아마도 내 나름대로 코딩을 한달 정도 배우며 매주 궁금한 점 의 페이지를 링크와 함께 가득 차지하는 '메소드란 무엇인가?' '클래스란 무엇인가?' '필드란 무엇인가?'에 대해 정의한 것을 써보려한다!

 

여억시 오늘도...

크게 한 수 배웠다!

 

역시 처맞아야 배운다니깐 

나는 프로 학습러 ^^

 

덧붙이는 테스트 코드 작성법

어제는 무조건 원칙은 

함수식은 메인페이지

테스트에 할당하는 변수는 테스트 페이지에서 직접 이렇게 정리를 했는데 그렇지 않은 경우도 있다.

예를 들면 식을 사용할때 반드시 메인에서만 해야하는 것도 아니고 변수를 꼭 어썰트식에 넣어주지 않아도 된다.(즉 자유롭게 해도된다..방법만 맞다면..)

@Test
void case1() {
  int[] a = {1,2,3,4};
  int[] b = {-3,-1,0,2};

  int answer = 0;
  for(int i = 0; i < a.length; i += 1) {
    answer += a[i]*b[i];
  }
assertEquals(3,answer);
}

이렇게 테스트 코드안에서 선언과 식을 넣어서 1개의 경우를 시험해도 되고

메인에 식을 써준 후 

@Test
void case4() {
  InnerProduct innerProduct = new InnerProduct();


  assertEquals(-2,innerProduct.solution(new int[] {-1,0,1},new int[]{1,0,-1}));
  
}

이렇게 간단하게 해봐도 된다.

 

위 고민이 나온 이유와 이해한 것(다른 클래스 변수를 가져올수있나?, 배열을 변수란에 어떻게 넣지?)

1. 식을 메인에 써주고 하려다가 이번에는 메소드에 넣어야할 변수가 배열이라서 어떤식으로 넣는 지 몰라서 메인에서 선언해준 변수를 어떻게 가져오고 테스트 코드에 넣지라는 고민을 하게 되었다. 결국 넣을 줄 몰라서 식을 테스트 코드 안에 다 써서 돌렸는데 작동했다. (단 배열 하나 선언(값)당 한번의 테스트 밖에 못한다.)

2. 클래스 선언한후 클래스명.메소드명(변수) 에서 변수가 배열의 형태일 때  배열은 new int[] {1,2,3} 으로 넣어주면된다는 것을 알았다.(int[] a {1,2,3} , a[] {1,2,3} 다 안되었다.)

참고) 배열 선언 형식

int[] array = {1,2,3,4,5} 

int[] array = new int[] {1,2,3,4,5}

3. 메인 클래스의 메소드는 클래스 선언 후 클래스명.메소드이름()로 가져와지는데 클래스의 변수는 가져올 수 없을까? 라는 생각을 하고 그것이 필드변수가 아닐까 생각해서 this.result = result 식의 시도를 해봤는데 아니었다. 필드 변수에 대한 더 자세한 정의가 필요하다. 

다른 클래스의 변수를 가져오는 것이 가능하다.

 

아래처럼 클래스 명 밑에서 선언해주면 같은 클래스 내에서 사용이 가능하고

다른 클래스에서도 쓰려면 static을 붙여주면 된다. 그러면 클래스명.변수명 으로  사용가능하다

 

class Ex_variables {

int global_int; // 전역변수(객체변수) : 같은클래스에서 호출이 가능

static int global_statuc_int; // 전역변수(클래스변수) : 다른 클래스에서도 호출이 가능

void method() { i

nt local_int = 0; //지역변수 { }안에 생성되며 { }를 벗어나면

}

//method() 라는 메소드가 끝나는 시점에 바로 삭제

}

 

 

댓글