Myślę, nad pierwszym problemem, który mógłby rozwiązywać nasz system.
Niestety mamy błędy kompilacji:
Zanim zacznę tworzyć brakujące klasy warto wprowadzić strukturę katalogów z kodem produkcyjnym i testowym oddzielnie:
Teraz odpalam swoje testy tak:
Do katalogu ze źródłami dodaję pliki klas:
i kod klas:
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ę.
Nope, Nie działa. Okazuje się że ruby szuka klas tylko w tych katalogach:
Nie ma tam mojego katalogu z kodem.
Mogę podejść do tego problemu dwojako:
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?
Najpierw trzeba napisać plik Rakefile.
Kod do ustawiania katalogu dodam w następnym wpisie.
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.
Może to się dziać za pomocą jakiegoś medium. Dodaję aktorów do systemu:Poprzedni odcinek tu: https://michalkulinski.blogspot.fr/2017/03/no-dobra-to-czas-moze-utworzyc-pierwsza.html
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:
- Albo mogę dodać mój katalog z kodem do tej listy.
- ruby -Ilib [katalog_z kodem źródłowym]
- 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.
Rzucasz czytelnika w sam środek akcji, przez co trudno poznać kontekst tego, co się czyta, a szkoda, bo czyta się lekko i przyjemnie ;]
OdpowiedzUsuń(sorki za podwójny komentarz, możesz usunąć jeden - pomyliłem konta)
Michale,
OdpowiedzUsuń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ę :)