CS编程AutotestUNSWMonash调试技巧编程辅导

CS 编程作业怎么通过 Autotest:从 Edge Case 到 Debug 策略

2 min read

"代码本地运行完全正常,但提交到 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-12^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 == 0n < 0lst 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

不要从头开始逐行读代码。用"二分法"缩小问题范围:

  1. 在代码中间加 print() 输出中间结果
  2. 确认到哪一步还是对的,到哪一步开始错了
  3. 把问题范围缩小到 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 失败的结果就开始盲目修改,这是低效的。

正确流程:

  1. 看清楚是哪一类 test 失败(Edge Case?正常输入?大输入?)
  2. 手动构造一个类似的 test case
  3. 确认问题所在后才修改代码
  4. 修改完先在本地跑,再提交

如果你正在为 CS 编程作业的 Autotest 发愁,欢迎联系我们进行代码 Review 和 Debug 辅导——我们可以帮助你系统理清思路,而不只是修改代码。

相关辅导:Programming Help → | UNSW 课程支持 → | Monash 课程支持 →

推荐服务

💻

代码跑不通?作业逻辑卡住了?

Deadline 前搞定。发送代码/题目给客服,30 分钟内评估,安排 CS 专业导师。

扫码咨询发 Brief · 30 分钟报价