Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: 첫번째 인적사항 페이지 테스트 코드 #167

Merged
merged 4 commits into from
Aug 31, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
172 changes: 172 additions & 0 deletions frontend/cypress/e2e/application.personal_info.cy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
const BASE_URL = "http://localhost:3000";

describe("인적사항 첫번째 페이지 입력 검증 테스트: ", () => {
beforeEach(() => {
cy.visit(`${BASE_URL}/application`);
cy.clearAllLocalStorage();
cy.get("label").contains("개발자").click();
cy.get("label").contains("WEB").click();
cy.wait(100);
cy.get("label").contains("선택없음").click();
cy.get("button").contains(/다음/).click();
Comment on lines +5 to +11
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 내용은 commands.ts 파일에 Cypress.Commands.add를 이용해서 함수로 만들어 사용해 보는게 좋을 것 같아요 !

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

네 좋습니다! 민보님이랑 건규님도 commands로 만드셔서 호출하신거 같은데, 여기서 구현하면 중복이 일어날 것 같으니 다 PR머지된 이후 새로 작성하겠습니다 ~

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 알겠습니다 !


cy.get("input").first().as("nameInput");
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아래 코드와 형식을 맞추기 위해서 first() -> eq(0)으로 변경하는 것도 좋아보여요. (이건 개인적인 생각입니다.)

cy.get("input").eq(1).as("phoneInput");
cy.get("input").eq(2).as("studentIdInput");
cy.get("input").eq(3).as("academicStatusInput");
cy.get("label").contains("4학년").as("fourthGradeLabel");
});

it("사용자는 이름을 5글자까지 입력할 수 있다.", () => {
cy.get("@nameInput").type("에").should("have.value", "에").clear();
cy.get("@nameInput").type("에코노").should("have.value", "에코노").clear();
cy.get("@nameInput").type("abcde").should("have.value", "abcde").clear();
});

it("사용자는 5글자가 넘는 이름을 입력할 시 앞의 5글자까지만 입력을 받는다.", () => {
cy.get("@nameInput")
.type("에코노베이션")
.should("have.value", "에코노베이")
.clear();
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

혹시.. 마지막 부분에 clear를 붙인 이유가 있나요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should로 assertion이 끝나서 값을 비워주려고 clear()를 호출하였습니다~!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

습관성..? 이랄까요?ㅋㅋ

});
Comment on lines +26 to +31
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오... 바로 위의 코드로 저는 합칠 생각을 했었는데 이렇게 보니, 코드를 나누는 것이 더 좋아보입니다.


it("사용자는 연락처에 11자리 숫자만 기입할 수 있다. 숫자를 기입하면, 표준 연락처 형식에 맞게 값을 보여준다.", () => {
cy.get("@phoneInput")
.type("01011111111")
.should("have.value", "010-1111-1111")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

조금 과한 액션일 수도 있는데 옆에 주석으로 정규식을 작성해보는 것도 좋을 것 같습니다 !

/^\d{3}-\d{4}-\d{4}$/

.clear();
});

it('사용자가 연락처를 입력한 시점부터 연락처 형식에 맞게 작성을 완료하지 못한경우 "연락처를 입력해주세요." 라는 안내문구가 입력창에 나타난다.', () => {
cy.get("@phoneInput").type("01011");
cy.get("@phoneInput")
.siblings()
.find("div")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이것도 괜찮지만, find 이후 exist로 테스트 하는 것도 의미상 괜찮아 보입니다.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오호 넵 너무좋네요 감사합니다~!

.should("have.text", "연락처를 입력해주세요.");
});

it("사용자는 학번에 6자리 숫자를 입력할 수 있다.", () => {
cy.get("@studentIdInput").type("1").should("have.value", "1").clear();
cy.get("@studentIdInput").type("123").should("have.value", "123").clear();
cy.get("@studentIdInput")
.type("123456")
.should("have.value", "123456")
.clear();
});

it("사용자는 학번에 6자리를 초과하는 숫자를 입력할 경우 앞의 6글자까지만 입력받는다.", () => {
cy.get("@studentIdInput")
.type("1234567")
.should("have.value", "123456")
.clear();
});

it('사용자는 학번을 입력한 시점부터 학번 형식에 맞게 작성을 완료하지 못한경우 "학번을 입력해주세요"라는 안내문구가 입력창에 나타난다.', () => {
cy.get("@studentIdInput").type("1");
cy.get("@studentIdInput")
.siblings()
.find("div")
.should("have.text", "학번을 입력해주세요.");
});

it("사용자는 학적상태(재학/휴학)을 입력할 수 있다.", () => {
cy.get("@academicStatusInput")
.type("재학중")
.should("have.value", "재학중")
.clear();
cy.get("@academicStatusInput")
.type("부트캠프로 인한 휴학. 2025년 1학기에 복학할 예정입니다.")
.should(
"have.value",
"부트캠프로 인한 휴학. 2025년 1학기에 복학할 예정입니다."
);
});

it("사용자는 학년을 선택한 후 학기를 1학기, 2학기 중 선택할 수 있다.", () => {
cy.get("@fourthGradeLabel").click();
cy.get("label").contains(/학기/).eq(0).click();

cy.getAllLocalStorage({ log: true }).then((result) => {
const ls = result[BASE_URL];
expect(ls["grade"]).to.match(/4학년/);
expect(ls["semester"]).to.match(/1학기/);
});
});
});

describe("인적사항 첫번째 페이지 전환 테스트:", () => {
beforeEach(() => {
cy.visit(`${BASE_URL}/application`);
cy.clearAllLocalStorage();
cy.get("label").contains("개발자").click();
cy.get("label").contains("WEB").click();
cy.wait(100);
cy.get("label").contains("선택없음").click();
cy.get("button").contains(/다음/).click();

cy.get("input").first().as("nameInput");
cy.get("input").eq(1).as("phoneInput");
cy.get("input").eq(2).as("studentIdInput");
cy.get("input").eq(3).as("academicStatusInput");
cy.get("label").contains("4학년").as("fourthGradeLabel");
});

it("모든 올바른 값을 입력한 뒤에는 작성한 값이 LocalStorage에 저장된다.", () => {
/* test 케이스 데이터 */
const testSuite = {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저였으면, 단순히 하나씩 equal()에 그대로 박았을 것 같은데, 이렇게 묶는 것이 훨씬 가독성이 좋네요.. 저도 참고하도록 하겠습니다

input: {
name: "김아무개",
contacted: "01012341234",
classOf: "123456",
registered: "재학",
grade: "4학년",
semester: "1학기",
},
Comment on lines +117 to +124
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 코드는 무엇을 뜻하나요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

testSuite를 나타내는 객체인데요, 입력과 나와야하는 출력을 데이터로 구조화? 해보았습니다 ㅋㅋ

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

사실... 이 데이터를 안써서 어떻게 되어 있나 의미상 넣어두었나 싶었어요 ㅋㅋㅋ(의미상 넣어둔거군요)

answer: {
name: '"김아무개"',
contacted: '"010-1234-1234"',
classOf: '"123456"',
registered: '"재학"',
grade: '"4학년"',
semester: '"1학기"',
},
};
/* 폼 작성 */
cy.get("@nameInput").type("김아무개");
cy.get("@phoneInput").type("01012341234");
cy.get("@studentIdInput").type("123456");
cy.get("@academicStatusInput").type("재학");
cy.get("@fourthGradeLabel").click();
cy.get("label").contains(/학기/).eq(0).click();

/* 값 검증 */
cy.getAllLocalStorage({ log: true }).then((result) => {
// TODO: 중복 줄이기
const ls = result[BASE_URL];
expect(ls["name"]).to.equal(testSuite.answer.name);
expect(ls["contacted"]).to.equal(testSuite.answer.contacted);
expect(ls["classOf"]).to.equal(testSuite.answer.classOf);
expect(ls["registered"]).to.equal(testSuite.answer.registered);
expect(ls["grade"]).to.equal(testSuite.answer.grade);
expect(ls["semester"]).to.equal(testSuite.answer.semester);
});
});

it("질문 제목 네비게이션을 통해 이전 페이지로 이동 가능하다.", () => {
cy.get("button")
.contains(/프로젝트 희망 분야/)
.click();
cy.get("span")
.contains("2순위가 없다면 '없음'을 선택해주세요.")
.should("have.text", "2순위가 없다면 '없음'을 선택해주세요.");
});

it("현재 페이지가 제대로 작성되어있지 않은 상황에서 이후 질문 페이지로 이동 시 작성을 요청하는 alert창이 나타난다.", () => {
cy.get("button")
.contains(/기타 질문 사항/)
.click();
cy.on("window:alert", (text) => {
expect(text).to.equal("필수 질문을 작성해주세요.");
});
Comment on lines +168 to +170
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 부분은 건규님이 작성하는 함수로 대체하는게 좋아보이네요.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#167 (comment) 와 같이 다음 PR에서 리팩토링 해보겠습니다!

});
});