"代码本地运行完全正常,但提交到 Autotest 就失败了"——这是 UNSW、Monash、QUT、UofT 的 CS 学生在期末前最常遇到的噩梦。
这篇文章解释为什么会发生这种情况,以及系统性的 Debug 策略。
Autotest 为什么和本地不一样
Autotest 系统(如 UNSW 的 give autotest、Monash 的 EdStem 测试、UofT 的 MarkUs)和你在本地运行的测试有几个关键不同:
1. 测试用例包含 Edge Case
你自己测试时,可能只测了"正常情况"。Autotest 专门测边界情况:
- 空输入(empty string、empty list、
None) - 最小/最大值(
0、-1、2^31 - 1) - 单元素 vs 多元素
- 已排序 vs 逆序 vs 全相同元素
2. 环境差异
- Autotest 通常在 Linux 环境运行(Windows 本地开发可能有路径分隔符
\vs/问题) - Python 版本可能不同(你用 3.11,服务器可能是 3.9)
- 文件编码差异(UTF-8 vs 其他)
3. 时间限制
部分 Autotest 有严格的时间限制(如 5 秒内完成)。你的算法可能对小输入跑得很快,但对大输入时间复杂度太高会超时。
Edge Case 清单:提交前必查
以下是最常见的 Edge Case 类型,提交前逐一自测:
Python 编程
# 1. 空输入
my_function([]) # 空列表
my_function("") # 空字符串
my_function(None) # None 输入
# 2. 单元素
my_function([1])
# 3. 负数
my_function([-1, -5, 0])
# 4. 重复元素
my_function([3, 3, 3])
# 5. 已排序 / 逆序
my_function([1, 2, 3])
my_function([3, 2, 1])
递归函数特别检查
- Base Case 是否完整:
n == 0?n < 0?lst is None? - 递归终止条件:有没有可能无限递归?
- 返回值:每个分支都有
return吗?
文件 I/O
# 错误写法(Windows 路径分隔符)
open("data\input.txt")
# 正确写法(跨平台)
import os
open(os.path.join("data", "input.txt"))
系统性 Debug 策略
第一步:读懂错误信息
Autotest 通常会给出失败的测试用例和错误类型:
Test case 3 FAILED
Expected: [1, 2, 3]
Got: [1, 2]
这告诉你:某个 test case 输出少了一个元素。先想清楚这个 test case 可能是什么输入,然后再去找 bug。
第二步:Binary Search Debug
不要从头开始逐行读代码。用"二分法"缩小问题范围:
- 在代码中间加
print()输出中间结果 - 确认到哪一步还是对的,到哪一步开始错了
- 把问题范围缩小到 10 行以内再仔细分析
第三步:最小复现(Minimal Reproduction)
找到让代码失败的最小输入:
# 你发现 autotest 失败了,先构造最小 failing case
my_function([]) # 失败吗?
my_function([1]) # 失败吗?
my_function([1, 2]) # 失败吗?
最小复现让你更容易定位问题,也方便向导师或 TA 描述 bug。
第四步:检查算法复杂度(超时问题)
如果 Autotest 报 Time Limit Exceeded,检查:
- 有没有嵌套循环在大输入时变成 O(n²) 或 O(n³)?
- 递归有没有重复计算(考虑 Memoization)?
- 排序用的是什么方法(Bubble Sort O(n²) vs
sorted()O(n log n))?
UNSW autotest 特别提示
UNSW 的 autotest 命令会在 CSE 服务器上运行,和你本地环境不同:
# 在 CSE 服务器上先测试
ssh z1234567@cse.unsw.edu.au
cd assignment
autotest
本地测试通过后,一定要在 CSE 服务器上再测一遍,因为文件系统和 Python 版本可能不同。
拿到反馈后怎么改进
很多同学拿到 Autotest 失败的结果就开始盲目修改,这是低效的。
正确流程:
- 看清楚是哪一类 test 失败(Edge Case?正常输入?大输入?)
- 手动构造一个类似的 test case
- 确认问题所在后才修改代码
- 修改完先在本地跑,再提交
如果你正在为 CS 编程作业的 Autotest 发愁,欢迎联系我们进行代码 Review 和 Debug 辅导——我们可以帮助你系统理清思路,而不只是修改代码。
相关辅导:Programming Help → | UNSW 课程支持 → | Monash 课程支持 →
