理想的狀態是在開始程式開發之前,首先明確定義專案需求並撰寫相對應的測試案例。接著,我們採用「紅燈/綠燈(Red/Green)」的測試驅動開發(TDD)策略,這樣就能逐步、有計劃地完成專案。對於那些尚未熟悉測試語法或工具的開發者如果來說,初期可能需要投入更多時間來練習,因為養成良好的測試習慣也是開發過程中不可或缺的一環。
值得一提的是,在撰寫測試的過程中,我也常會發現原有程式碼中存在可優化或改進的部分。這不僅有助於提升程式的品質,也能讓整個開發流程更加順暢。
雖然這次的開發過程中,可能無法完全按照標準的TDD方法來執行,但我補充了基本的測試,包括單元測試(unit test)和端到端測試(e2e test)以確保程式的穩定性和可靠性。
npm install --save-dev vitest @vue/test-utils
npm install vitest
import { shallowMount } from "@vue/test-utils";
import { describe, it, expect } from "vitest"
import Playboard from "@/components/Playboard.vue";
describe("Playboard.vue", () => {
it("renders mounted 顯示標題,測試物件基本渲染", () => {
const msg = "時間線任務";
const wrapper = shallowMount(Playboard);
const title = wrapper.get('[data-test="title"]')
expect(title.text()).toMatch(msg);
});
it("頁面切換",async () => {
const wrapper = shallowMount(Playboard);
const btn = wrapper.get('[data-test="game-start-btn"]')
await btn.trigger('click')
expect(wrapper.get('[data-test="timeline"]').exists()).toBe(true)
});
it("計分", async () => {
const wrapper = shallowMount(Playboard);
wrapper.vm.isGameStart = true
wrapper.vm.gameStatus.scoreRecord = [1, 2, 3, 4, 5]
wrapper.vm.gameStatus.score = wrapper.vm.getTotalScore()
await wrapper.vm.$nextTick()
expect(wrapper.get('[data-test="score"]').text()).include(15)
});
it("分數回饋", async () => {
const wrapper = shallowMount(Playboard);
wrapper.vm.isGameEnd = true
const msg = '非常好!你對網頁開發的歷史有著很好的掌握,在這個領域幾乎是專家囉。';
const comment = wrapper.vm.gameComment(20)
expect(comment).toBe(msg)
});
});
npm install --save-dev cypress
describe('測試在 Mobile 版本下的拖曳功能', () => {
beforeEach(() => {
cy.viewport('iphone-6')
})
it('正確與錯誤兩種情況產生的作答結果', () => {
cy.visit('http://localhost:5173/TimelineQuest-ithelp-sample/')
cy.get('[data-test="game-start-btn"]').click()
cy.get('[data-test="timeline"]').should('be.visible')
cy.get('[data-test="clue-card"]').trigger('touchstart').trigger('touchmove', { which: 1, pageX: 190, pageY: 250 }).trigger('touchend')
cy.get('[data-test="timeline-event-year-correct"]').should('have.text', '1995').should('have.class', 'bg-[#5cb887]')
cy.get('[data-test="clue-card"]').trigger('touchstart').trigger('touchmove', { which: 1, pageX: 190, pageY: 450 }).trigger('touchend')
cy.get('[data-test="timeline-event-year-wrong"]').should('have.text', '2015').should('have.class', 'bg-[#d25353]')
})
})
注:具體的測試計劃會根據您的實際需求和目標而有所不同。
參考資料
如何使用 Vue 和 Jest 測試拖曳和放置
Vitest 功能指南
[Jsdom 設定
TDD 的三大法則
Cypress 官方文件
ChatGPT