17 marca 2017

Prezentacja aktorów

Myślę, nad pierwszym problemem, który mógłby rozwiązywać nasz system.
Wydaje mi się, że na początku potrzebne jest nawiązanie kontaktu pomiędzy właścicielami biznesów - klientami, a posiadaczami programistycznej wiedzy tajemnej  - ludźmi z IT.

Poprzedni odcinek tu: https://michalkulinski.blogspot.fr/2017/03/no-dobra-to-czas-moze-utworzyc-pierwsza.html

Może to się dziać za pomocą jakiegoś medium. Dodaję aktorów do systemu:


def test_if_there_are_actors_of_that_tragedy                                                                                         
                                                                                                                                       
    client = Client.new                                                                                                                
    it_people = ItPeople.new                                                                                                           
    media = Media.new                                                                                                                  
                                                                                                                                       
    assert_not_null(client);                                                                                                           
    assert_not_null(people);
    assert_not_null(media);                                                                                                            
                                                                                                                                       
end 


Niestety mamy błędy kompilacji:


coola@sv26 [/home/coola/dsp2017/xp-simulator]# ruby smoke_test.rb                                                                      
Loaded suite smoke_test                                                                                                                
Started                                                                                                                                
E                                                                                                                                      
=======================================================================================================================================
Error: test_if_there_are_actors_of_that_tragedy(FirstSmokeTestClass): NameError: uninitialized constant FirstSmokeTestClass::Client    
smoke_test.rb:13:in `test_if_there_are_actors_of_that_tragedy'                                                                         
     10:                                                                                                                               
     11:   def test_if_there_are_actors_of_that_tragedy                                                                                
     12:                                                                                                                               
  => 13:     client = Client.new                                                                                                       
     14:     it_people = ItPeople.new                                                                                                  
     15:     media = Media.new                                                                                                         
     16:                                                                                                                               
=======================================================================================================================================
.                                                                                                                                      
                                                                                                                                       
Finished in 0.001111911 seconds.                                                                                                       
---------------------------------------------------------------------------------------------------------------------------------------
2 tests, 1 assertions, 0 failures, 1 errors, 0 pendings, 0 omissions, 0 notifications                                                  
50% passed                                                                                                                             
---------------------------------------------------------------------------------------------------------------------------------------
1798.71 tests/s, 899.35 assertions/s                                                                                                   


Zanim zacznę tworzyć brakujące klasy warto wprowadzić strukturę katalogów z kodem produkcyjnym i testowym oddzielnie:


coola@sv26 [/home/coola/dsp2017/xp-simulator]# mkdir src                                                                               
coola@sv26 [/home/coola/dsp2017/xp-simulator]# mkdir test                                                                              
coola@sv26 [/home/coola/dsp2017/xp-simulator]# mv smoke_test.rb ./test/smoke_test.rb                                                   
coola@sv26 [/home/coola/dsp2017/xp-simulator]# ls                                                                                      
README  src  test                                 


Teraz odpalam swoje testy tak:


coola@sv26 [/home/coola/dsp2017/xp-simulator]# ruby ./test/smoke_test.rb                                                               
Loaded suite ./test/smoke_test                                                                                                         
Started                                                                                                                                
E                                                                                                                                      
=======================================================================================================================================
Error:

Do katalogu ze źródłami dodaję pliki klas:


coola@sv26 [/home/coola/dsp2017/xp-simulator]# touch ./src/Client.rb                                                                   
coola@sv26 [/home/coola/dsp2017/xp-simulator]# touch ./src/ItPeople.rb                                                                 
coola@sv26 [/home/coola/dsp2017/xp-simulator]# touch ./src/Media.rb                                                                    
coola@sv26 [/home/coola/dsp2017/xp-simulator]# ls ./src/                                                                               
Client.rb  ItPeople.rb  Media.rb  

i kod klas:

class Client                                                                                                                           
end


class ItPeople                                                                                                                         
end


class Media                                                                                                                            
end

Teraz - jak zrobić, żeby te klasy były widoczne z pliku testowego?

Posiłkując się Stackiem:

http://stackoverflow.com/questions/3672586/what-is-the-difference-between-require-relative-and-require-in-ruby?noredirect=1&lq=1

Dowiedziałem się, że słówko kluczowe require powinno załatwić sprawę.


coola@sv26 [/home/coola/dsp2017/xp-simulator]# ruby ./test/smoke_test.rb                                                               
/usr/share/ruby-2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- src/Client.rb (LoadE
rror)                                                                                                                                  
        from /usr/share/ruby-2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'                                  
        from ./test/smoke_test.rb:2:in `<main>'                                                                                        
coola@sv26 [/home/coola/dsp2017/xp-simulator]#     

Nope, Nie działa. Okazuje się że ruby szuka klas tylko w tych katalogach:


coola@sv26 [/home/coola/dsp2017/xp-simulator]# ruby -e "puts $:"                                                                       
/usr/share/ruby-2.3.1/lib/ruby/site_ruby/2.3.0                                                                                         
/usr/share/ruby-2.3.1/lib/ruby/site_ruby/2.3.0/x86_64-linux                                                                            
/usr/share/ruby-2.3.1/lib/ruby/site_ruby                                                                                               
/usr/share/ruby-2.3.1/lib/ruby/vendor_ruby/2.3.0                                                                                       
/usr/share/ruby-2.3.1/lib/ruby/vendor_ruby/2.3.0/x86_64-linux                                                                          
/usr/share/ruby-2.3.1/lib/ruby/vendor_ruby                                                                                             
/usr/share/ruby-2.3.1/lib/ruby/2.3.0                                                                                                   
/usr/share/ruby-2.3.1/lib/ruby/2.3.0/x86_64-linux    

Nie ma tam mojego katalogu z kodem.
Mogę podejść do tego problemu dwojako:


  1. Albo mogę dodać mój katalog z kodem do tej listy.
    • ruby -Ilib [katalog_z kodem źródłowym]
  2. Albo mogę ustawić w pliku testowym ścieżki względne przez require_relative 
    • require_relative "../src/Client.rb"
Rozwiązanie pierwsze nie podoba mi się, ponieważ uzależniam odpalenie mojego kodu od zmiennej środowiskowej. Ktoś, kto by chciał ściągnąć mój kod musiałby ustawić tę zmienną ręcznie chcąc uruchomić mój kod. 

Drugie rozwiązanie odpycha mnie wizją skomplikowania zależności. Gdybym chciał zmienić położenie pliku z kodem testowym, musiałbym zmieniać ścieżki zaraz za require_relative 

Może warto zaprząc do pracy jakieś narzędzie do budowania automatycznego. Coś, co by automatycznie ustawiało ścieżkę do katalogu z kodem i odpalało testy.

To może Rake?


coola@sv26 [/home/coola/dsp2017/xp-simulator]# gem install rake                                                                        
Fetching: rake-12.0.0.gem (100%)                                                                                                       
Successfully installed rake-12.0.0                                                                                                     
1 gem installed              


Najpierw trzeba napisać plik Rakefile.


task default: %w[test]                                                                                                                 
                                                                                                                                       
task :test do                                                                                                                          
  ruby "test/smoke_test.rb"                                                                                                            
end

Kod do ustawiania katalogu dodam w następnym wpisie.

2 komentarze:

  1. Rzucasz czytelnika w sam środek akcji, przez co trudno poznać kontekst tego, co się czyta, a szkoda, bo czyta się lekko i przyjemnie ;]

    (sorki za podwójny komentarz, możesz usunąć jeden - pomyliłem konta)

    OdpowiedzUsuń
  2. Michale,
    Rzeczywiście powinienem dać na początku artykułu link do poprzedniego i na końcu do następnego.
    Dzięki za dobre słowa. Polałeś miód na mą zbolała programistyczną duszę :)

    OdpowiedzUsuń

Podstawy Programowania Funkcyjnego Epizod 3

Czy wszystkie Zasady Się Zmieniają? Kiedy tylko zaczynamy używać nowego paradygmatu , porównujemy z nim na...