# 作業一
## 作業概述
- 本次作業完成 Line coverage 的測試
- 包含
- 14 行程式碼
- 4 個 test case
- 2 個缺失的設計
## 程式結構分析
### 測試特別結構分析
- 3 到 6 行為迴圈
- 計算學生成績
- 7 到 14 行為條件判斷
- 學生成績的等級判定
### 程式碼
```python
# 計算學生成績等級:
def process_student_data(scores):
# 初始化變數
total = 0 # 第1行
count = 0 # 第2行
# 迴圈 - 計算學生平均成績
while count < len(scores): # 第3行
total += scores[count] # 第4行
count += 1 # 第5行
average = total / len(scores) # 第6行
# 條件判斷 - 學生成績的等級判定
if average >= 90: # 第7行
return "A" # 第8行
elif average >= 80: # 第9行
return "B" # 第10行
elif average >= 70: # 第11行
return "C" # 第12行
else: # 第13行
return "F" # 第14行
```
## 測試案例
| Test Case 1 | Result |
| -------- | -------- |
| Input values | scores=[90, 95] |
| Expected result | A |
| Test program's result | A |
| Criteria analysis | 1~6, 7, 8 |
| Test Case 2 | Result |
| -------- | -------- |
| Input values | scores=[80, 82] |
| Expected result | B |
| Test program's result | B |
| Criteria analysis | 1~6, 7, 9, 10 |
| Test Case 3 | Result |
| -------- | -------- |
| Input values | scores=[75, 77] |
| Expected result | C |
| Test program's result | C |
| Criteria analysis | 1~6, 7, 9, 11, 12 |
| Test Case 4 | Result |
| -------- | -------- |
| Input values | scores=[20, 30] |
| Expected result | F |
| Test program's result | F |
| Criteria analysis | 1~6, 7, 9, 11, 13, 14 |
## 測試案例詳述
- 測試案例一
- 測試成績為 A 的狀況
- 測試:1~6, 7, 8 行
- 測試案例二
- 測試成績為 B 的狀況
- 測試:1~6, 7, 9, 10 行
- 測試案例三
- 測試成績為 C 的狀況
- 測試:1~6, 7, 9, 11, 12 行
- 測試案例四
- 測試成績為 F 的狀況
- 測試:1~6, 7, 9, 11, 13, 14 行
- 總結
- 四個測試案例
- Line Coverage 100%
## 測試工具展示
- 測試案例一
```python
def test_case_1_grade_A(self):
# 測試案例 1 - A 等級
result = process_student_data([90, 95])
print("預期結果為 A,實際結果為:", result)
assert result == "A"
```

- 測試案例二
```python
def test_case_2_grade_B(self):
# 測試案例 2 - B 等級
result = process_student_data([80, 82])
print("預期結果為 B,實際結果為:", result)
assert result == "B"
```

- 測試案例三
```python
def test_case_3_grade_C(self):
# 測試案例 3 - C 等級
result = process_student_data([75, 77])
print("預期結果為 C,實際結果為:", result)
assert result == "C"
```

- 測試案例四
```python
def test_case_4_grade_F(self):
# 測試案例 4 - F 等級
result = process_student_data([20, 30])
print("預期結果為 F,實際結果為:", result)
assert result == "F"
```

- 測試結果
```
python3 -m pytest
collected 4 items
=== 4 passed in 0.01s ===
```

- coverage 查看

## 缺失的檢測與查看
### 缺失設計(一)
- 刪除 Test Case 3
### 缺失結果(一)
```
collected 3 items
=== 3 passed in 0.02s ===
```


### 缺失設計(二)
- 修改 Test Case 1 測試的輸出為 '優'
### 缺失結果(二)
```
=== FAILURES ===
___ TestCalculator.test_case_1_grade_A ___
self = <complex_calculator_test.TestCalculator object at 0x1056b8a50>
def test_case_1_grade_A(self):
# 測試案例 1 - A 等級
result = process_student_data([90, 95])
> assert result == "優"
E AssertionError: assert 'A' == '優'
E
E - 優
E + A
complex_calculator_test.py:8: AssertionError
=== short test summary info ===
FAILED complex_calculator_test.py::TestCalculator::test_case_1_grade_A - AssertionError: assert 'A' == '優'
=== 1 failed, 3 passed in 0.03s ===
```
