🎉

Rubyで標準入出力をテストする

2022/08/30に公開

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

  1. AtCoder, (2022), A - Middle Letter, Retrieved from https://atcoder.jp/contests/abc266/tasks/abc266_a (最終アクセス日:2022 年 8 月 30 日)
  2. 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

ログインするとコメントできます