🎉
Rubyで標準入出力をテストする
AtCoder の問題を Ruby で解いていた時に「テストを書きたいな 🤔」と思ったので、標準入出力のテストをやってみます。標準入出力をテストするのは始めての経験なので、ちょっと試行錯誤しました。
まずは AtCoder の問題を解きます。ABC 266 の A 問題です(参考文献 1)。こんな感じで AC になります。
# abc255_a.rb
s = gets.chomp
puts s[s.size / 2]
肝心のテストですが、stringio
を使うとできそうです(参考文献 2)。AtCoder の Ruby のバージョンにあわせて、 2.7.1
のリファレンスを参照しています。
まずは標準入力の書き方。
$stdin = StringIO.new("atcoder\n")
次に標準出力の書き方。いろいろな書き方がありそうですが、この書き方を使いました。
$stdout = StringIO.new
out = $stdout.string
実際にテストを書いてみます。atcoder
という入力に対して、o
という出力を期待しています。先に load
を呼んでしまうと永遠に待ちが終わりませんでした(直感的に、load
→ 標準入力の順で呼ぶものと思っていました)。
def test_atcoder
$stdin = StringIO.new("atcoder\n")
$stdout = StringIO.new
load './lib/abc255_a.rb'
out = $stdout.string
assert_equal 'o', out.lines[0].chomp
end
テストファイルの全体を以下に示します。
require 'minitest/autorun'
require 'stringio'
require_relative '../test_helper'
class TestAbc255A < Minitest::Test
def test_atcoder
$stdin = StringIO.new("atcoder\n")
$stdout = StringIO.new
load './lib/abc255_a.rb'
out = $stdout.string
assert_equal 'o', out.lines[0].chomp
end
def test_a
$stdin = StringIO.new("a\n")
$stdout = StringIO.new
load './lib/abc255_a.rb'
out = $stdout.string
assert_equal 'a', out.lines[0].chomp
end
end
Reference
- AtCoder, (2022), A - Middle Letter, Retrieved from https://atcoder.jp/contests/abc266/tasks/abc266_a (最終アクセス日:2022 年 8 月 30 日)
- Ruby-Doc.org, Class: StringIO (Ruby 2.7.1), Retrieved from https://ruby-doc.org/stdlib-2.7.1/libdoc/stringio/rdoc/StringIO.html (最終アクセス日:2022 年 8 月 30 日)
Discussion