iT邦幫忙

2026 iThome 鐵人賽

DAY 11
0
Build on Google AI

將考國際證照的應用程式變成開源系列 第 16

search.feature , security.feature , tts-voice.feature , wrong-questions.feature

  • 分享至 

  • xImage
  •  

search.feature
Feature: 題目搜尋
搜尋功能允許使用者使用各種條件、過濾器
與進階 AI 語義搜尋來尋找特定考試題目。

Background:
Given 我以「viewer」身分登入
And 我在「題庫」畫面

Scenario: 依題目編號搜尋
When 我在搜尋列輸入「Q-205」
And 我按下 Enter
Then 搜尋結果應僅顯示 ID 為「Q-205」的題目

Scenario Outline: 依題目類型過濾
When 我開啟搜尋過濾面板
And 我選取「」過濾器
And 我點擊「套用過濾」
Then 搜尋結果應僅包含「」類型的題目

Examples:
  | QuestionType    |
  | 單選題   |
  | 多選題 |
  | 拖曳題   |
  | 模擬題      |

Scenario: 依領域/主題 (1-6) 過濾
When 我開啟搜尋過濾面板
And 我從主題下拉選單選取「領域 3」
And 我點擊「套用過濾」
Then 搜尋結果應僅包含歸類在「領域 3」下的題目

Scenario: 依包含圖片旗標過濾
When 我開啟搜尋過濾面板
And 我將「有圖片」過濾器切換為 true
And 我點擊「套用過濾」
Then 搜尋結果應僅包含含有圖片的題目

Scenario: 題目標題關鍵字搜尋
When 我在搜尋列輸入「OSPF 設定」
And 我按下 Enter
Then 搜尋結果應包含標題或文字中有「OSPF 設定」的題目

Scenario: AI 向量語義搜尋 (768 維度嵌入)
When 我輸入自然語言查詢「如何防止交換迴圈」
And 我點擊「語義搜尋」按鈕
Then 系統應針對查詢產生 768 維度向量嵌入
And 系統應透過向量相似度搜尋回傳概念相關的題目
And 搜尋結果應包含關於「生成樹協定」的題目,即使未使用精確字詞

Scenario Outline: AI 搜尋對訪客/待處理角色受限
Given 我以「」身分登入
When 我嘗試使用「語義搜尋」功能
Then 該功能應為「」
And 如被封鎖應有提示解釋高級限制

Examples:
  | Role    | AccessState |
  | guest   | 封鎖     |
  | pending | 封鎖     |
  | viewer  | 允許     |

Scenario: 組合多欄位過濾搜尋
When 我開啟搜尋過濾面板
And 我選取「多選題」作為題目類型
And 我選取「領域 2」作為主題
And 我在關鍵字搜尋輸入「IPv6」
And 我點擊「套用過濾」
Then 搜尋結果應僅包含領域 2 中包含「IPv6」的多選題

security.feature
Feature: 安全防護執行
系統執行嚴格的安全防禦措施以保護考試內容、防止作弊,
並在所有支援平台上限制未經授權的存取。

Background:
Given 應用程式在正式環境模式下執行
And AuthWrapper 安全閘道為啟用狀態

Scenario: 偵測到 Root/越獄裝置 - 阻擋存取 (所有角色)
Given 應用程式安裝於已 Root 或越獄的裝置
When 使用者啟動應用程式
Then root 偵測檢查應失敗
And 應用程式應顯示安全違規錯誤
And 應用程式應自動退出

Scenario: 偵測到模擬器 - 阻擋存取 (所有角色)
Given 應用程式在模擬器中執行
When 使用者啟動應用程式
Then 模擬器偵測檢查應失敗
And 應用程式應顯示安全違規錯誤
And 應用程式應自動退出

Scenario Outline: 偵測到開發者模式
Given 裝置已啟用開發者模式
And 使用者以「」角色登入
When 安全閘道驗證環境
Then 存取結果應為「」

Examples:
  | Role   | Outcome                      |
  | viewer | 封鎖並顯示錯誤訊息   |
  | admin  | 允許 (豁免)           |

Scenario Outline: 偵測到 VPN 連線
Given 裝置連線至 VPN
And 使用者以「」角色登入
When 安全閘道驗證網路連線
Then 存取結果應為「」

Examples:
  | Role   | Outcome                      |
  | viewer | 封鎖並顯示錯誤訊息   |
  | admin  | 允許 (豁免)           |

Scenario Outline: 偵測到模擬位置
Given 裝置使用模擬位置提供者
And 使用者以「」角色登入
When 安全閘道驗證環境
Then 存取結果應為「」

Examples:
  | Role   | Outcome                      |
  | viewer | 封鎖並顯示錯誤訊息   |
  | admin  | 允許 (豁免)           |

Scenario Outline: 螢幕截圖防護
Given 使用者以「」角色登入
When 使用者嘗試對考試題目截圖
Then 截圖結果應為「」

Examples:
  | Role   | Outcome                                   |
  | viewer | 阻擋 (黑畫面或作業系統封鎖)      |
  | admin  | 允許 (豁免)                        |

Scenario: 偵測到螢幕分享/投射 - 非管理員被封鎖 (3秒輪詢)
Given 使用者以「viewer」身分登入
When 使用者啟動螢幕投射至外部顯示器
Then 3秒輪詢機制應偵測到螢幕分享
And 應用程式應顯示隱私覆疊遮擋內容

Scenario: 螢幕被遮蔽/點擊挾持偵測 - 顯示覆疊阻擋
Given 使用者以「viewer」身分登入
When 惡意應用程式在考試應用程式上繪製覆疊
Then 點擊挾持偵測機制應觸發
And 應用程式應顯示安全警告覆疊遮擋內容

Scenario: NTP 時間驗證 - 偵測到時間回溯 - 阻擋存取
Given 使用者已登入
When 使用者將系統時鐘往回調 30 天以繞過到期
And 應用程式執行 NTP 時間同步檢查
Then 時間驗證應失敗
And 應用程式應以「時間不符」錯誤阻擋存取

Scenario: NTP 時間驗證 - 接受 1 分鐘容忍值
Given 使用者已登入
When 系統時鐘與 NTP 伺服器有 45 秒誤差
And 應用程式執行 NTP 時間同步檢查
Then 時間驗證因容忍值應通過
And 應用程式應正常運作

Scenario Outline: 動態浮水印顯示
Given 使用者以「」角色登入
And 使用者具有 UID「USER123」與電子郵件「user@example.com
When 使用者檢視考試題目
Then 畫面應算繪動態浮水印
And 浮水印應包含「USER123」與「user@example.com
And 浮水印不透明度應為「」

Examples:
  | Role   | ExpectedOpacity |
  | viewer | 0.5             |
  | guest  | 0.8             |

Scenario: Web: 停用右鍵點擊
Given 使用者透過網頁瀏覽器存取應用程式
When 使用者在考試內容按右鍵
Then 不應出現右鍵選單
And 動作應被忽略

Scenario: Web: 停用文字選取
Given 使用者透過網頁瀏覽器存取應用程式
When 使用者嘗試點擊拖曳選取考試文字
Then 應透過 CSS user-select 屬性阻止文字選取

Scenario: Web: 偵測到開發者工具觸發
Given 使用者透過網頁瀏覽器存取應用程式
When 使用者開啟瀏覽器開發者工具 (F12)
Then 應用程式應偵測到開發者工具狀態變更
And 應用程式應清除畫面或顯示安全警告

Scenario Outline: Web: 封鎖鍵盤快捷鍵
Given 使用者透過網頁瀏覽器存取應用程式
When 使用者按下「」
Then 應阻止預設的瀏覽器動作

Examples:
  | Shortcut |
  | Ctrl+S   |
  | Ctrl+P   |
  | F12      |
  | Ctrl+C   |

Scenario: 偵錯模式略過安全檢查
Given 應用程式在偵錯模式下編譯
When 應用程式在已 Root 的模擬器上啟動
Then 應略過所有安全檢查
And 應用程式應能正常運作以供開發目的

tts-voice.feature
Feature: 文字轉語音與語音模式
應用程式提供無障礙存取與免持學習選項,
透過文字轉語音 (TTS) 功能與語音辨識來回答題目。

Background:
Given 我以「viewer」身分登入
And 我正在檢視認證考試題目

Scenario: TTS 大聲朗讀英文題目標題
When 我點擊「語音朗讀」按鈕
Then TTS 引擎應大聲朗讀英文的題目標題
And UI 應指示音訊正在播放

Scenario: TTS 以可設定的語速朗讀
Given 我導覽至 TTS 設定
And 我將語速設定為「1.5x」
When 我點擊題目上的「語音朗讀」按鈕
Then TTS 引擎應以 1.5 倍的正常速度朗讀文字

Scenario: TTS 順序佇列 (speakAwait) 確保依序播放
Given 題目包含標題與多個選項
When 我觸發完整題目朗讀
Then TTS 引擎應完整朗讀標題
And 等待標題結束後再朗讀選項 A
And 等待選項 A 結束後再朗讀選項 B
And 使用 speakAwait 邏輯維持順序播放

Scenario: 免持語音模式:TTS 朗讀題目 -> STT 聆聽答案
When 我啟動「免持語音模式」
Then TTS 引擎應自動朗讀題目與選項
And 完成後,語音轉文字 (STT) 引擎應自動開始聆聽
And 畫面上應出現麥克風指示器

Scenario Outline: 語音模式:使用者說出答案字母
Given 「免持語音模式」已啟動且正在聆聽
When 我大聲說出字母「」
Then 應用程式應選取選項「」作為我的答案
And 應用程式應繼續評估答案或移動至下一題

Examples:
  | SpokenLetter | Letter |
  | A            | A      |
  | B            | B      |
  | C            | C      |
  | D            | D      |

Scenario: 語音模式:使用者說「解釋」觸發 AI 解析
Given 「免持語音模式」為啟用狀態且我答錯
And STT 引擎正在聆聽
When 我大聲說出單字「解釋」
Then 應用程式應觸發 AI 家教功能
And AI 應產生該題的解析並大聲朗讀

Scenario: 使用者互動時停止 TTS 播放
Given TTS 引擎目前正在朗讀很長的解析
When 我手動點擊螢幕或滑動至下一題
Then TTS 播放應立即停止
And 音訊佇列應被清除

Scenario: Web 平台使用瀏覽器 speechSynthesis API
Given 我透過網頁瀏覽器使用應用程式
When 我點擊「語音朗讀」按鈕
Then 應用程式應與原生的 Web Speech API (window.speechSynthesis) 介接
And 無需依賴行動原生外掛即可朗讀文字

wrong-questions.feature
Feature: 錯題檢閱與消除
身為學習者,
我想檢閱我先前答錯的題目,
以便我能專注在弱點區域並提升知識。

Background:
Given 使用者已登入
And 使用者有一些記錄的錯題

Scenario: 錯誤答案自動加入錯題清單
Given 使用者正在進行練習測試
When 使用者答錯一道題目
Then 該題的 ID 會被記錄在該使用者的錯題資料庫中

Scenario: 錯題依最近一次嘗試排序
When 使用者開啟錯題清單
Then 題目會依最近一次答錯日期遞減排序

Scenario: 檢閱特定考試的錯題
When 使用者依考試「Cert-A」過濾錯題
Then 僅顯示屬於「Cert-A」的錯題

Scenario: 正確回答錯題 - 從清單中移除
Given 使用者正在檢閱一道錯題
When 使用者提交正確答案
Then 該題目會從錯題清單中移除
And 顯示成功訊息

Scenario: 錯誤回答錯題 - 增加錯誤次數
Given 使用者正在檢閱一道錯題
When 使用者提交錯誤答案
Then 該題目仍留在清單上
And 該題的歷史錯誤次數會增加

Scenario: 每日檢閱次數追蹤
Given 使用者每日檢閱限制為 20 題
When 使用者檢閱 5 道錯題
Then 每日檢閱次數更新為 5
And 剩餘允許檢閱次數為 15

Scenario: 跨考試全域錯題計數 (儀表板徽章)
When 使用者檢視主儀表板
Then 徽章顯示所有考試的錯題總數

Scenario: 無限每日檢閱的高級限制
Given 使用者為免費用戶,每日限制 20 次檢閱
And 使用者今天已檢閱 20 道題目
When 使用者嘗試檢閱另一道錯題
Then 存取被拒絕
And 顯示購買高級訂閱的提示

Scenario: 從安全本地儲存載入錯題
Given 應用程式處於離線狀態
When 使用者導覽至錯題畫面
Then 錯題從 SQLCipher 加密的本地資料庫中載入

Scenario: 清除考試的所有錯題
Given 使用者正在檢視某考試的錯題
When 使用者點擊「全部清除」
And 確認這項破壞性操作
Then 該考試的所有錯題將從該使用者帳號永久刪除


上一篇
建立和管理 Cloud Spanner 實例:挑戰實驗室
下一篇
test-spec : 01-test-strategy , 02-unit-tests , 03-widget-tests
系列文
將考國際證照的應用程式變成開源27
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言