Skip to content

Commit 59ffdb4

Browse files
committed
Explain how to write test
1 parent eff337f commit 59ffdb4

File tree

3 files changed

+66
-2
lines changed

3 files changed

+66
-2
lines changed

Diff for: src/SUMMARY.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
- [利用するクレートの選択とコンパイル (TODO)](./participate/before-contest/choose-crates.md)
1919
- [プロジェクトのコピー (TODO)](./participate/before-contest/copy-project.md)]
2020
- [コンテスト開始後の流れ (TODO)](./participate/during-contest/index.md)
21-
- [テストケースの作成 (TODO)](./todo.md)
21+
- [テストケースの作成 (TODO)](./participate/during-contest/write-tests.md)
2222
- [プログラムの作成 (TODO)](./todo.md)
2323
- [プログラムのテスト (TODO)](./todo.md)
2424
- [プログラムの提出 (TODO)](./todo.md)

Diff for: src/participate/during-contest/index.md

-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
**TODO** このページは書きかけです。
66

77
1. 問題を開き、テストケースを記述します。
8-
- テストで`cargo test`を利用しない方は不要です。
98
1. プログラムを書きます。
109
1. テストします。
1110
1. プログラムを提出します。

Diff for: src/participate/during-contest/write-tests.md

+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# テストケースの作成
2+
3+
**TODO** このページは書きかけです。
4+
5+
Rust には組み込みでテストをするための機構が備わっています。これらの様式に則ってテストを書くと、 `cargo test` コマンドを実行するだけでテストを実行することができます。これを競プロでもサンプルケースが通るかどうかを確かめるのに利用することができます。この機能の使い方の例として、生成したテンプレートの `tests/sample_inputs.rs` には [AtCoder Beginner Contest 086 C - Traveling](https://atcoder.jp/contests/abc086/tasks/arc089_a) のサンプルケースが書かれています。
6+
7+
> Note: 直接手と目で確認する場合や、別のコンテスト支援ツールを利用する場合などはこの手順は必要ありません。また `cargo test` を利用しない場合、サンプルのテストファイルは削除しても良いですし、しなくても特に問題はありません。
8+
9+
なんとなく見れば分かるように、 `output_with_stdin()` の引数にサンプル入力を渡し `assert_eq!(output.stdout_str(), <expected output>);` で期待する出力と一致するかどうかを確かめます。一致しない場合、テストは失敗します。
10+
11+
```rust
12+
use cli_test_dir::*;
13+
14+
const BIN: &'static str = "./main";
15+
16+
#[test]
17+
fn sample1() {
18+
let testdir = TestDir::new(BIN, "");
19+
let output = testdir
20+
.cmd()
21+
.output_with_stdin(r#"2
22+
3 1 2
23+
6 1 1
24+
"#)
25+
.tee_output()
26+
.expect_success();
27+
assert_eq!(output.stdout_str(), "Yes\n");
28+
assert!(output.stderr_str().is_empty());
29+
}
30+
31+
#[test]
32+
fn sample2() {
33+
let testdir = TestDir::new(BIN, "");
34+
let output = testdir
35+
.cmd()
36+
.output_with_stdin(r#"1
37+
2 100 100
38+
"#)
39+
.tee_output()
40+
.expect_success();
41+
assert_eq!(output.stdout_str(), "No\n");
42+
assert!(output.stderr_str().is_empty());
43+
}
44+
45+
#[test]
46+
fn sample3() {
47+
let testdir = TestDir::new(BIN, "");
48+
let output = testdir
49+
.cmd()
50+
.output_with_stdin(r#"2
51+
5 1 1
52+
100 1 1
53+
"#)
54+
.tee_output()
55+
.expect_success();
56+
assert_eq!(output.stdout_str(), "No\n");
57+
assert!(output.stderr_str().is_empty());
58+
}
59+
```
60+
61+
標準入力を書く場合、通常のダブルクオートでも改行を含めることはできますが、特別な文字 (`\``"` など) を含む場合に備えて、サンプルのように `r#"........"#` のような形式を使うとよいかもしれません。
62+
63+
> Note: `r"..."` は基本的には普通の文字列ですが、文字列内の `\` をエスケープしません。また `"` そのものを含めたいときに備えて `r####"...."####` のように `#` を任意個挟むことができます。
64+
65+
なお、この方法では出力を単純に文字列同士の比較によって判定しています。浮動小数点数のように出力に誤差を認める形式や「グラフを一つ出力せよ」のように解が複数あり得る問題のテストにはそのままでは利用できません。それでもテストには任意のコードがかけるわけですから (実際にそこまでするかどうかは別としても) 浮動小数点数やグラフをパースしてチェックするというような使い方も可能です。

0 commit comments

Comments
 (0)