Раздел «Язык Ruby».RubySchoolSourceL05:
<<Программирование на Ruby

Занятие 5: Unit-тесты и тестирование производительности

Следующее занятие
Предыдущее занятие

Домашнее задание

Проверка числа на простоту

class Integer
  def prime?
    (2...self).all?{|i| self % i != 0}
  end
end

puts 5.prime?
puts 9.prime?
(1..100).each do |n|
  puts "#{n} " + (n.prime? ? "is prime" : "is not prime")
end

Проверка проверки числа на простоту

class Integer
  def prime?
    (2...self).all?{|n| self % n != 0}
  end
end

if $0 == __FILE__
  require 'test/unit'
  class PrimeTest < Test::Unit::TestCase
    def test_small
      [1,2,3].each do |i|
        assert(i.prime? , "Wrong result for #{i}")
      end
      
      assert(!4.prime? , "Wrong result for #{4}")
    end
    
    def test_simple
      assert(5.prime?, "Wrong result for 5")
      assert(!9.prime?, "Wrong result for 9")
    end
    
    def test_squares
      (2..1000).each do |i|
        assert( ! (i*i).prime?, "Wrong result for #{i*i}=#{i}*#{i}" )
      end
    end
  end
end

Обычно тесты пишут в отдельных файлах:

* lib
  * prime.rb
* test
  * unit
    * test_prime.rb
  * functional
    * ..
  * integral
    * ..

Оптимизируем и измеряем

class Integer
  def prime?
    (2..Math.sqrt(self)).all?{|n| self % n != 0}
  end
  
  def prime_old?
    (2...self).all?{|n| self % n != 0}
  end
end

if $0 == __FILE__
 
  require 'benchmark'
  
  Benchmark.bm do |b|
    b.report("new") do 
      (1..10_000).each do |i|
        i.prime?
      end
    end
    b.report("old") do 
      (1..10_000).each do |i|
        i.prime_old?
      end
    end
  end

  require 'test/unit'
  class PrimeTest < Test::Unit::TestCase
    def test_small
      [1,2,3].each do |i|
        assert(i.prime? , "Wrong result for #{i}")
      end
      
      assert(!4.prime? , "Wrong result for #{4}")
    end
    
    def test_simple
      assert(5.prime?, "Wrong result for 5")
      assert(!9.prime?, "Wrong result for 9")
    end
    
    def test_squares
      (2..1000).each do |i|
        assert( ! (i*i).prime?, "Wrong result for #{i*i}=#{i}*#{i}" )
      end
    end
  end
end