24112


勉強のため、簡単なコードを書くさいに、ファイルを分割せずに、一つのファイルにてテストを書いたほうが簡潔で良いことがあります。

他のプログラミング言語だと、Pythonなら[DocTest](http://docs.python.jp/3.5/library/doctest.html)であったり、あるいはRacketだと[rackunit](http://docs.racket-
lang.org/rackunit/)のように、一つのファイルにてテストを記入する方法があります。

Rubyだと、[minitest/unit](http://docs.ruby-
lang.org/ja/2.1.0/library/minitest=2funit.html)が存在しており、確かにこれで、一つのファイルにて`require
'minitest/autorun'`をすると、コマンド上ではテストが走ります。

ですが、`irb`でファイルを`require`したあとに、REPLを終了させると、テストが走ってしまうので、違和感があります。

確かに、上記の方法では、最低限の「一つのファイルで実行コードとテストを同時に記入する」という要件は満たせるのですが、もしかしたら、これはバッドノウハウなのでは、という疑問がぬぐえません。

もし、Rubyで「一つのファイルの中で、実行コードとテストを同時に記入する」ときには、どういう方法を取るのが良いのでしょうか？


CC BY-SA 3.0
2016-04-18T02:51:42.527
24104
2016-04-18T07:31:47.833
939
question
ruby
一つのファイルの中で、実行コードとテストを同時に記入するさいのプラクティス


`$0`/`$PROGRAM_NAME`と擬似変数の`__FILE__`を比較して、直接ファイルが実行された場合のみ`require
'minitest/autorun'`するとよいのではないでしょうか。

<http://docs.ruby-lang.org/ja/2.1.0/method/Kernel/v/0.html>  
<http://docs.ruby-lang.org/ja/2.1.0/doc/spec=2fvariables.html#pseudo>

## 例

[code]

    class C
      def foo
        'foo'
      end
    end
    
    require 'minitest/unit'
    
    class TestC < Minitest::Unit::TestCase
      def setup
        @c = C.new
      end
    
      def test_foo
        assert_equal 'foo', @c.foo
      end
    end
    
    if $0 == __FILE__
      require 'minitest/autorun'
    end
    
[/code]


CC BY-SA 3.0
2016-04-18T07:31:47.833
24112
2016-04-18T07:31:47.833
2599
24104
answer