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: 신청폼 희망분야 페이지 e2e 테스트 작성 #166

Merged
merged 11 commits into from
Aug 27, 2024
Merged
Show file tree
Hide file tree
Changes from 8 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
121 changes: 121 additions & 0 deletions frontend/cypress/e2e/application.chapter.cy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
describe("chapter", () => {
Copy link
Collaborator

Choose a reason for hiding this comment

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

먼가... 이 또한 어떤 것임을 알려주는 describe면 좋겠군요...(저는 사실 회의를 참여 하지 않아서 제 3자라고 생각하고 보십쇼)

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

아 해당 부분은 수정이 필요한게 맞습니다.. 저만 올바르게 작성하지 않았네요

beforeEach(() => {
cy.clearAllCookies();
cy.clearLocalStorage();
cy.clearAllSessionStorage();

cy.viewport(1920, 1080);
cy.visit("http://localhost:3000/application");
});

describe("초기 상태(처음 진입시, 로컬 데이터가 없는 상태)에서", () => {
it("질문 제목 네비게이션 클릭시 “필수 질문을 작성해주세요.” 알람창이 뜬다. ", () => {
cy.get("button").contains("기본 인적 사항을 입력해주세요.").click();
Copy link
Collaborator

Choose a reason for hiding this comment

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

테스트 없이 개발할 때는 몰랐지만, 여기서 "기본 인적 사항을 입력해주세요"와 같은 string들은 constants라는 폴더에 한번에 다룬다면 나중에 2군데, 3군데 수정 없이 작동할 것 같다라는 생각이 드네요(이래서 따로 빼는거였나...?)

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

맞아요 조금 반복되는 부분이 있는 것 같습니다..!
반복되더라도 하드하게 작성한 이유는 예전 아래의 아티클을 읽고 이게 맞다고 생각을 했던 것 같습니다..
방금 다시 읽어보니 조금은 다른 문제를 다루고 있어서 제가 잘못 생각한 부분이 있는 것 같습니다.
해당 부분 수정해보겠습니다!

https://jojoldu.tistory.com/615


cy.checkAlert("필수 질문을 작성해주세요.");
});
it("다음 버튼 클릭시 “필수 질문을 작성해주세요.” alert창이 뜬다. ", () => {
cy.get("button").contains("다음").should("exist").click();

cy.checkAlert("필수 질문을 작성해주세요.");
});
Copy link
Collaborator

Choose a reason for hiding this comment

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

오... false에 대한 내용을 작성하시는 꼼꼼함까지... ㄷㄷㄷㄷ

describe("개발자(디자이너/기획)를 누르면", () => {
beforeEach(() => {
cy.get("label").contains("개발자").click();
});
it("질문 제목 네이게이션에서 개발자(디자이너/기획자)에 대한 질문들을 볼 수 있다.", () => {
cy.get("span")
.contains(
"자기소개 및 에코노베이션에 지원하게 된 계기를 서술해 주세요."
)
.should("exist");

cy.get("span")
.contains("개발자를 희망하는 이유는 무엇인가요?")
.should("exist");

cy.get("span")
.contains("소프트웨어 프로젝트에서 주도적으로 개발한 경험이 있나요?")
.should("exist");

cy.get("span")
.contains("어떤 일에 도전하고 실패해 본 경험이 있나요?")
.should("exist");

cy.get("span")
.contains("무언가에 깊게 빠지거나 파고 들어본 적이 있나요?")
.should("exist");

cy.get("span")
.contains(
"협업(프로젝트, 팀 활동)에 있어서 가장 중요하다고 생각되는 것은 무엇인지 서술해 주세요."
)
.should("exist");

cy.get("span")
.contains(
"에코노베이션에 들어오게 된다면 어떤 목표와 학습 계획을 바탕으로 활동하고 싶나요?"
)
.should("exist");

cy.get("span")
.contains("자신을 어필할 수 있는 포트폴리오를 업로드해주세요.")
.should("exist");

cy.get("span")
.contains("개인정보 수집에 관한 안내 및 개인정보 수집")
.should("exist");

cy.get("span")
.contains("개인정보 수집에 관한 안내 및 개인정보 수집")
.should("exist");
});
it("질문 제목 네이게이션 클릭 시 “필수 질문을 작성해주세요.” alert창이 뜬다. ", () => {
cy.get("button").contains("기본 인적 사항을 입력해주세요.").click();

cy.checkAlert("필수 질문을 작성해주세요.");
});
it("다음 버튼 클릭시 “필수 질문을 작성해주세요.” alert창이 뜬다. ", () => {
cy.get("button").contains("다음").should("exist").click();

cy.checkAlert("필수 질문을 작성해주세요.");
});

describe("1순위 분야를 선택하면", () => {
beforeEach(() => {
cy.get("label").contains("APP").click();
});
it("2순위로는 동일한 분야를 선택할 수 없다.", () => {
const secondChapterAPPButton = cy.get(".bg-gray-200");
secondChapterAPPButton.click();

cy.checkLocalStorage("field2", '""');
});
describe("2순위를 선택한 후", () => {
beforeEach(() => {
const secondChapterAPPButton = cy.get('[for=":r1:"]');
secondChapterAPPButton.click();
});
Copy link
Collaborator

Choose a reason for hiding this comment

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

흑흑... 이게 무엇을 의미하는건가요...? label을 기점으로 button에 대한 설명이 부족한가요??

추가로 next 것을 사용할 수 있답니다.(물론 input이 무조건 label뒤에 있어야하지만, 일반적으로 그렇게 짜니깐요...?)

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

하하... next의 존재를 모르고 있어서 이런 코드가 나왔던 것 같습니다.. 🥲
수정해보겠습니다!

it("2순위와 동일한 분야를 1순위에서 선택할 수 없다.", () => {
cy.checkLocalStorage("field1", '"APP"');

cy.get(":nth-child(2) > .bg-gray-200").click();

cy.checkLocalStorage("field1", '"APP"');
});

it("선택하지 않는 분야를 1순위에서 선택시 2순위 선택이 풀린다", () => {
cy.get("label").contains("AI").click();

cy.checkLocalStorage("field2", '""');
});
it("다음 버튼을 누르면 다음 질문(기본 인적사항)으로 넘어간다.", () => {
cy.get("button").contains("다음").should("exist").click();

cy.contains("기본 인적 사항을 입력해주세요.").should("exist");
});
});
});
});
});
});
59 changes: 23 additions & 36 deletions frontend/cypress/support/commands.ts
Original file line number Diff line number Diff line change
@@ -1,37 +1,24 @@
/// <reference types="cypress" />
// ***********************************************
// This example commands.ts shows you how to
// create various custom commands and overwrite
// existing commands.
//
// For more comprehensive examples of custom
// commands please read more here:
// https://on.cypress.io/custom-commands
// ***********************************************
//
//
// -- This is a parent command --
// Cypress.Commands.add('login', (email, password) => { ... })
//
//
// -- This is a child command --
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
//
//
// -- This is a dual command --
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
//
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
//
// declare global {
// namespace Cypress {
// interface Chainable {
// login(email: string, password: string): Chainable<void>
// drag(subject: string, options?: Partial<TypeOptions>): Chainable<Element>
// dismiss(subject: string, options?: Partial<TypeOptions>): Chainable<Element>
// visit(originalFn: CommandOriginalFn, url: string, options: Partial<VisitOptions>): Chainable<Element>
// }
// }
// }

declare namespace Cypress {
interface Chainable<Subject> {
checkLocalStorage(key: string, expectedValue: string): Chainable<void>;
checkAlert(expectedValue: string): Chainable<void>;
}
}

Cypress.Commands.add(
"checkLocalStorage",
(key: string, expectedValue: string) => {
cy.window().then((win) => {
const actualValue = win.localStorage.getItem(key);
expect(actualValue).to.equal(expectedValue);
});
}
);
Comment on lines +11 to +19
Copy link
Collaborator

Choose a reason for hiding this comment

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

로컬 스토리지를 확인하는 코드 좋네요. 저도 merge후에 사용하겠습니다 !

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

좋습니다!

Copy link
Collaborator

Choose a reason for hiding this comment

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

좋은 추상화네요 👍


Cypress.Commands.add("checkAlert", (expectedValue: string) => {
cy.on("window:alert", (str) => {
expect(str).to.equal(expectedValue);
});
Comment on lines +11 to +24
Copy link
Collaborator

Choose a reason for hiding this comment

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

오... 먼가 flux 패턴같은 느낌.... redux같은 느낌의 코드이군요 ㅋㅋㅋ

Comment on lines +21 to +24
Copy link
Collaborator

Choose a reason for hiding this comment

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

저는 alert 창의 내용을 콘솔창에 출력되도록만 했는데 alert 창의 내용까지 검증하는 코드 굉장히 좋은 것 같아요.

});