jest

박요셉·2023년 10월 30일
0

Javascript

목록 보기
8/11

javascript에서 쓰는 test Framework중 가장 대중적인 것인 jest
사용법을 알아보자.

__test__ 폴더 하의 파일 또는 test.js 파일 들을 검사하며 기본적인 사용법은 아래와 같다.

// fn폴더 내용
const fn = {
  add: (num1, num2) => num1 + num2,
  makeUser: (name, age) => ({name, age }),
  throwErr: () => {
    throw new Error("xx");
  },
  getName: (callback) => {
  	const name = "Mike";
    setTimeout(() => {callback(name)},3000)
  },
  getAge: () => {
   const age = 30;
   return new Promise((res,rsj) => {
    setTimeout(() => {
     res(age); 
    },3000);
   });
  },
};
---------------
const fn = require("/fn")

test('3+2는 5야', () => {
  expect(fn.add(3,2)).toBe(5); 
});

toBe 부분에 사용하는 함수들을 Matcher라고 한다.
toBe는 문자, 수 등 일반 기본 타입 값을 비교할 때 사용한다.


 test('이름과 나이를 전달받아서 객체를 반환해줘', () => {
expect(fn.makeUser('Mike',30)).toBe({name: "Mike", age:30,});
});//결과값 X

//객체나 배열은 주기적으로 돌며 값을 확인해주어야 하기 때문에 toequal을 써야한다.
//화면상에선 toBe를 쓸 시에 toStrictEqual을 써주라고 나온다.
// 보다 엄격하게 테스트를 진행하려면 toStrictEqual을 써야한다. gender:undefined라는 값이 있어도 toEqual은 무시하고 strict는 집어낸다.

// toBeNull
// toBeUndefined
// toBeDefined 
// 위의 것들은 이름 그대로 ㅇㅇ...

// toBeTruthy
// toBeFalsy
// Boolean값 판별
test("0은 false 입니다.", () => {
  expect(fn.add(1,-1)).toBeFalsy();
  }); //통과

// toBeGreaterThan 크다
// toBeGreaterThanOrEqual 크거나 같다
// toBeLessThan 작다
// toBeLessThanOrEqual 작거나 같다.

test("ID는 10자 이하여야 합니다.", () => {
  const id = "THE_BLACK_ORDER"; expect(id.length).toBeLessThanOrEqual(10);
}); // 실패!

test("비밀번호 4자리", () => {
	const pw = "1234"
	expect(pw.length).toBe(4);
}); // 성공 (또는 toEqual하면됨

test("0.1 더하기 0.2는 0.3 입니다.", () => {
  expect(fn.add(0.1,0.2).toBeCloseTo(0.3);
});// toBe를 쓰면 실패! 몇몇 컴퓨터 언어들은 소수점 이하를 계산하지 못한다 2진법을 쓰기 때문. 그렇기에 toBeCloseTo를 사용해야한다.

test(" Hello World 에 a 라는 글자가 있나?", () => {
  expect("Hello World").toMatch(/h/i);
});
// 정규표현식을 넣어줘야함 /a/ = a있어? /H/ H있어?, /h/i 대소문자 구분 없애줘

test("유저 리스트에 Mike 가 있나?", () => {
	const user = "Mike";
  	const userList = ["Tom", "Jane", "Kai"]
	expect(userList).toContain(user);
});

test("이거 에러 나나요?", () => {
	expect(() => fn.throwErr()).toThrow('oo');
}); //실패!

//에러 메세지 검사, 어떤 작업을 했을 때 특정 에러가 발생 되는지 확인.

test('3초 후에 받아온 이름은 Mike', (done) => {
 function callback(name) {
  expect(name).toBe("Mike"); 
  done();
 }
 fn.getName(callback);
});
// 테스트가 1ms만에 종료된다. 3초 이상은 걸려야하는데?
// jest는 비동기기 때문에 실행이 끝에 도달하면 그대로 끝난다.
// 그래서 예정되 있던 콜백이 실행이 안된것
// -> 위 코드 args부분에 done을 넣고 실행시켜준다면 실행을 기다려준다.

// callback 패턴보단 promise를 사용하는 패턴이 간결하고 더 낫다.
// promise를 반환하게 된다면 jest는 resoleve될 때까지 done을 넣어주지 않아도 기다려준다.

test('3초 후에 받아온 나이는 30", () => {
//     return fn.getAge().then(age => {
//		expect(age).toBe(30);
//	});
// 아래는 같은 코드
    return expect(fn.getAge()).resolves.toBe(30);
//reject를 보고싶다면 fn파일 내부에 res -> rej로 바꿔주고 해당 코드에서 resolves를 rejects로 바꿔줌 된다.
     
})
// promise를 쓸 때에는 코드를 return해줘야함, 안해준다면 바로 종료된다.  

// test 코드에 async await를 쓸 수도 있다.
test('3초 후에 나이 30', async() => {
 const age = await fn.getAge();
  expect(age).toBe(30)
  
     await expect(fn.getAge()).resolves.toBe(30);
  // return을 await으로 바꿔서 resolves를 사용할 수 있음.
});

let num = 0;

afterEach, beforeEach(() => {
 num = 0 
})
각 테스트가 끝날 때마다 해당 문장을 실행함.

beforeAll, afterAll = 최초, 최후에 한번.

decribe를 이용해서 비슷한 test들을 묶을 수 있음.

decribe("Car 관련 작업", () => {
 let cr;
  beforeAll(async () => {
   car = await fn.connectCarDb() 
  }.....
});

beforeEach = 바깥의 것인 먼저 -> 내부의 것이 나중 -> 내부의 afterEach가 먼저 -> 바깥의 afterEach가 나중
profile
개발자 지망생

0개의 댓글

관련 채용 정보