patpat 使用指南

BUAA 软件学院 2023 秋《面向对象程序设计》评测机使用指南


本学期 patpat 已更新,迭代三、四只能使用新的 patpat,迭代二新旧版本均可。

1. patpat 下载

本学期使用的各个版本的 patpat 下载链接如下:

支持 Windows,Linux 和 MacOS,包括:

  • patpat-linux-amd64
  • patpat-macos-amd64
  • patpat-macos-arm64
  • patpat-windows-amd64.exe

对于 Mac 与 Linux 用户,需要首先 chmod +x patpat,使评测机程序具有可执行权限。

请使用最新版本的 patpat,否则可能导致无法测评,或成绩无法被正确录入!🫣

Windows 下请使用 Terminal 打开 cmd 或 PowerShell,否则会乱码。


2. patpat 使用方法

2.1 评测文件准备

严格按照如下的目录层级与命名准备好评测相关文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
/                 # 存放所有评测文件的根目录
├── patpat.exe # Mac 与 Linux 用户程序无后缀,可重命名
├── 1-22******-Name/ # 第几次作业-学号-姓名
│   └── src/ # Java 项目源代码
│   ├── Test.java # 程序入口
│   ├── *.java # 其余 Java 文件
│   └── com/buaa/main # Java 包(可选)
├── report/ # 评测报告目录
└── test/ # 本地测评文件
├── judge.yaml # 用于告知评测机需要评测哪些测试点
├── testcase1.yaml # 具体测试点 1
├── testcase2.yaml # 具体测试点 2
└── ...

1-22******-Name/src/ 目录下,必须有 Test.java 作为程序入口。其他 Java 文件可以与 Test.java 并列,但是推荐按照一定结构放在单独的 Java 包中。😉

Test.java 不能在任何包下!即不能有 package 声明。

patpat 与普通的程序运行方式相同,如果要在命令行中使用 patpat,需要将 patpat-windows-amd64.exe 重命名为 patpat.exe

judge.yamltestcase.yaml 的编写方式见本地测评指南。🤔

2.2 自评自测

运行方式

在终端(如 Command Prompt,Bash 等)中运行如下命令:

1
2
./patpat stu -judge 1-22******-Name  # 本地测试命令
./patpat ta -judge 1-22******-Name -pwd your_password -tag judge_tag # 线上测试命令

这里的 1-22******-Name 需要与存放源文件的目录名名称对应,请修改为自己的相关信息。线上测试需要先注册。🥸

对于 Windows,命令中的 ./patpat 需要改为 .\patpat.\patpat.exe,或者直接使用 patpatpatpat.exe

评测结果

详细评测结果见生成的 $testcase$_result.md,报告会被统一输出到 report 目录下。

离线模式

仅在 stu 模式下有效,添加参数 -online=0

历史迭代评测

迭代在截止之后将无法评测,如果同学们想再次测试,可以在对应迭代名前加 10 来评测历史迭代,更改文件名即可。

如,第一次迭代 1-学号-姓名 对应的历史评测为 101-学号-姓名

历史评测仅用于辅助测试,不计入最终成绩。


2.3 查询助教评测结果

该功能只是查询历史评测结果,并不进行评测。

2.3.1 注册账号

查询助教评测结果前,需要注册账号 (sid 为您的学号),注册命令如下:

1
2
./patpat reg -sid your_sid -pwd your_password
# 例:./patpat reg -sid 18373722 -pwd buaa-se-oop

账号创建后,密码不支持修改。如需修改,请联系助教。

2.3.2 查询评测结果

1
./patpat query -sid your_sid -pwd your_password

学号及对应的密码正确后,即可显示截至目前的所有评测结果。

2.4 作业提交

首先,确保自己的程序能够通过线上自评自测,然后再将 Java 源代码文件夹打包,压缩为 .zip 格式,上传至云平台。

压缩包内文件结构如下(和自评自测时相同):

1
2
3
4
5
1-22******-Name/  # 第几次作业-学号-姓名
└── src/ # Java 项目源代码
├── Test.java # 程序入口
├── *.java # 其余 Java 文件
└── com/buaa/main # Java 包(可选)

压缩包内需要包括 1-22******-Name/ 文件夹哦。👻

请务必反复确认文件的命名,如有误将无法评测!🥴


3. 本地测评指南

3.1 judge.yaml的编写

1
2
# 请将本 judge.yaml 置于 test/ 目录下
tests: [testcase1.yaml, testcase2.yaml] # 可以添加更多 .yaml 测试点

在自评自测时,judge.yamltests 列表中的测试点名称,需要与 test 目录下的文件名一致。🧐

3.2 testcase.yaml 的编写

testcase.yaml 由两部分组成,名称和数据。

3.2.1 测试名称

任意名称即可。

1
name: testcase1

3.2.2 测试数据

测试数据中包含多个测试点,每个测试点为一个一级-,测试点中的输入输出分别对应一个二级 -

根据输入输出行数,可将测试点分为以下几种。不会有无输入,有输出的测试点。

单行输入,无输出

1
2
3
data:
-
- SUDO # 输入

单行输入,单行输出

1
2
3
4
data:
-
- nc hh12345678 oop6324 [10086,10001] 1 [1-16]2,3 # 输入
- Course add illegal. # 输出

单行输入,多行输出

1
2
3
4
5
6
7
8
data:
-
- myc 1 1000 # 输入
- | # 多行输出用 | 引导,注意接下来的缩进
Page:1
1.CID:bh00000002,Name:oop6326,Teachers:[A,B,10086],Capacity:1/100,Time:[1-10]1,5
2.CID:bh00000004,Name:oop6328,Teachers:[A,B],Capacity:1/100,Time:[11-18]1,5
3.CID:bh00000005,Name:oop6329,Teachers:[A,B],Capacity:1/100,Time:[1-18]1,6

多行输入,无输出

1
2
3
4
5
6
data:
-
- | # 多行输入同理
quit
quit again
quit quit

多行输入,单行输出

1
2
3
4
5
6
7
data:
-
- | # 多行输入
quit
quit again
QUIT
- ----- Good Bye! ----- # 单行输出

多行输入,多行输出

1
2
3
4
5
6
7
8
9
data:
-
- | # 多行输入
3
2
1
- | # 多行输出
Ready
Go!

不建议使用带有多行输入与多行输出的测试点。😈

这里 data 部分的数据类型相当于 String[n][2]。第一级的 - 表示一个测试点,第二级的第一个 - 对应输入,第二个(如果有的话)对应输出。第二级的输入是必须的,可以无输出,即至少为 1 个,至多为 2 个。

3.2.3 测试文件示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
name: testcase
data:
- # 单行输入,无输出
- SUDO
- # 单行输入,单行输出
- nc hh12345678 oop6324 [10086,10001] 1 [1-16]2,3
- Course add illegal.
- # 单行输入,多行输出
- myc 1 1000
- |
Page:1
1.CID:bh00000002,Name:oop6326,Teachers:[A,B,10086],Capacity:1/100,Time:[1-10]1,5
2.CID:bh00000004,Name:oop6328,Teachers:[A,B],Capacity:1/100,Time:[11-18]1,5
3.CID:bh00000005,Name:oop6329,Teachers:[A,B],Capacity:1/100,Time:[1-18]1,6
n-next page, l-last page, q-quit
- # 多行输入,无输出
- |
quit
quit again
quit quit
- # 多行输入,单行输出
- |
quit
quit again
QUIT
- ----- Good Bye! -----

3.2.4 补充说明

对于部分测试点中包含 : 的情况,YAML 会默认识别为字典,此时只需要用 "" 将整个字符串包起来即可,或是写成多行输出的格式,如下。

1
2
3
4
- Register shop success (shopid: S-1)   # 错误识别
- "Register shop success (shopid: S-1)" # 正确识别
- | # 正确识别
Register shop success (shopId: S-3)