Непрекъснато тестване с Autotest

  1. Здравейте,

    Изборът на текстов редактор, с който да пишете на Руби, в крайна сметка, е въпрос на лични предпочитания. В резултат на това, голяма част от хората, които тази година за първи път се срещат с езика, може да предпочетат да игнорират съветите на Стефан (и моите) да научат Емакс или Вим, а вместо това да продължат да използват редактор, с който са свикнали (или просто ги кефи минимапът му), но е по-малко функционален.

    Еднa от функционалностите, които по мое мнение са задължителни за бързото и лесно писане и рефакториране, а отсъстват от почти всички редактори, е наличието на continuous testing.

    Бих искал набързо да споделя опита си с конфигурирането на continuous testing с редактор с ограничена функционалност (да се разбира всичко, което не е Емакс или Вим) под Линукс.

    Забележка:

    Средата, която използвам е както следва:

    • Gnome-Shell 3.4.1
    • rvm 1.14.2 (stable)
    • ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
    • rspec 2.11.1
    • libnotify-bin
    • На скрийншота - Sublime Text, но autotest не зависи по никакъв начин от редактора.
    1. Нужните за autotest gem-ове се инсталират със следната команда: gem install autotest autotest-rails ZenTest test_notifier

    2. Съставете си ~/.autotest който да пази конфигурацията:

      require 'autotest/timestamp'
      require 'test_notifier/runner/autotest'
      

      Ако използвате Gnome-Shell, ще забележите, че нотификациите на test_notifier очакват да кликнете върху тях, което дразни. Много. За да заобиколите това, добавете следното в dotfile-a:

      module Notifier
        module NotifySend
          extend self
      
          def supported?
            RUBY_PLATFORM =~ /(linux|freebsd)/ && `which notify-send > /dev/null` && $? == 0
          end
      
          def notify(options)
            command = [
              "notify-send", "--hint=int:transient:1", "-i",
              options[:image],
              options[:title],
              options[:message]
            ]
      
            Thread.new { system(*command) }
          end
        end
      end
      

      И накрая, autotest е предвиден да работи с Rails и в резултат на това, евристиката му рядко сработва за Руби проекти. Това има страничния ефект веднъж минат ли всички тестове, при промяна да не се стартират отново. Оправя се със следната добавка в дотфайла: class Autotest def get_to_green begin rerun_all_tests wait_for_changes unless all_good end until all_good end end

    3. Дръжте тестовете си в правилната поддиректория на работното копие, спрямо конвенцията на фреймуърка за тестване, който ползвате. За RSpec това е spec.

    4. В работното си копие създайте .rspec файл със съдържание --format documentation --color

    5. Изпълнете командата autotest в работното си копие.

    Ето как изглежда работещо: http://i.imgur.com/TG7xt.png

    gl;hf

  2. Нещо подобно може да се постигне и с watchr + minitest и някакво notification приложение като libnotify-bin. Просто трябва да си напишете watchr скрипт, който да изпълнява minitest файла и да извежда резултата от теста чрез notification. Доста лесно се получава, особено ако ползвате libnotify-bin. Даже може да си оцветите съобщението, или да му добавите икона и дори сте независими от текстовия редактор. Направих едни примерни файлове за клас рационално число (този от лекцията), тест и watchr скрипт, който ползва libnotify-bin. Това е линкът. Ето и резултата.

Трябва да сте влезли в системата, за да може да отговаряте на теми.