To już ostatnie kroki, do tego, aby nasza aplikacja została opublikowana w chmurze Heroku!

Zacznijmy więc od testów jednostkowych. Nie będzie ich wiele, ponieważ do przetestowania mamy trzy funkcje, ale testy będą dwa, ponieważ funkcja saveToJson() posiada w swoim ciele funkcję getResponseFromApi ().

Stwórzmy nowy plik do testów, pod tytułem tests.py w folderze tests, który stworzyliśmy w pierwszej części tutoriala.

Python posiada wbudowany moduł – unittest, przeznaczony do testów jednostkowych.

Zacznijmy właśnie od zaimportowania modułu oraz funkcji, które będziemy testować. Sprawdzimy czy nasza apka łączy się z API, co będzie symbolizował status code 200 oraz czy testowy plik JSON posiada dane jakich oczekujemy

tests.py

# Add parent path to project
import sys
sys.path.append('..')
#imports
import unittest
from application.scripts import getResponseFromApi, saveToJson, readFromJson

Tworzymy klasę scriptsTestCase, która dziedziczy po modułowej klasie TestCase.

Następnie tworzymy metodę, która będzie testować naszą funkcję z modułu scripts.py, nazwijmy ją test_saveToJson oraz test_readFromJon .

Tutaj 2 ważne uwagi. Klasa testów, w tym przypadku scriptsTestCase, musi posiadać w swojej nazwie TestCase, znów metoda testu, przed rozpoczęciem jej nazwy musi posiadać przedrostek test_, co spowoduje automatyczne jej wywołanie po uruchomieniu pliku tests.py

tests.py

# Add parent path to project
import sys
sys.path.append('..')
#imports
import unittest
from application.scripts import getResponseFromApi, saveToJson, readFromJson

class scriptsTestCase(unittest.TestCase):

	def test_saveToJson(self):
		response_final_result = getResponseFromApi('javascript', 'california')
		self.assertEqual(response_final_result.status_code, 200)

	def test_readFromJon(self):
		jobs_file = readFromJson()
		self.assertEqual(jobs_file, [{'test':'test'}])

if __name__ == '__main__':
	unittest.main()

W metodzie test_saveToJson , umieszczamy zmienną response_final_result, do której przypisujemy naszą funkcję ze scripts.py, czyli getResponseFromApi(), podajemy jej przykładowe argumenty. Zbadajmy czy po podaniu ‚javascript’ oraz ‚california’, otrzymamy odpowiedź od serwera GitHub.

Następnie tworzymy metodę test_readFromJson, gdzie wczytamy testowy plik JSON, aby sprawdzić czy funkcja go czyta. W folderze tests stwórzmy plik z nazwą jobs.json, w której umieścimy kod:

[{"test":"test"}]

W oby funkcjach na sam koniec używamy metody asercji – assertEqual, czyli porównania, czy nasza funkcja, poda oczekiwany wynik. Oczekujemy statusu 200, w przypadku pierwszej co oznacza, że serwer zezwolił na dostęp, oraz źródła pliku jobs.json w postaci [{‚test’:’test’}]

unittest.main() nakazuje Pythonowi wykonanie testów.

Pozostaje odpalić plik tests.py poprzez python tests.py

Wynik?

Test zaliczony! Nie ma błędów, ani związanych z nim komunikatem, więc możemy przejść dalej! 🙂
O samym module i testowaniu możecie przeczytać tutaj

Zacznijmy deploy!

Żeby móc umieścić naszą aplikację w chmurze Heroku, musimy najpierw przygotować kilka rzeczy:

  1. Pobierzemy Heroku CLI, czyli Command Line Interpreter. To narzędzie dostarczone przez Heroku, dzięki czemu push do chmury i budowa aplikacji przebiegnie automatycznie
  2. Zainstalować moduł Gunicorn – stworzy on wirtualny serwer w chmurze dla naszej aplikacji
  3. Plik requirements.txt – określający moduły jakie Heroku ma zainstalować przy budowaniu aplikacji w chmurze
  4. Plik Procfile – który określi z jakiego modułu i przy użyciu jakiego narzędzia ma zostać uruchomiona aplikacja

Zacznijmy więc!

Pobierzcie wspomniany wyżej Heroku CLI:
https://devcenter.heroku.com/articles/heroku-cli#download-and-install

Zainstalujcie w dowolnym katalogu.

Deploy na Heroku wymaga oczywiście konta, ale spokojnie, najmniejszy pakiet w chmurze na Heroku, dla takich drobnych apek jak nasza jest zupełnie darmowy, więc wystarczy się zarejestrować:
https://signup.heroku.com/login 🙂

Po rejestracji w panelu użytkownika stwórzmy nową apkę, po prawej stronie w górnym roku dashboardu:

Nazwijcie ją dowolnie, ale polecam trzymać się nazewnictwa naszej aplikacji, w przyszłości się nie pogubicie.

Create app i gotowe!

Konfiguracje i Gunicorn

Chyba już wiecie jak instalować moduły Flask? W tym odcinku robiliśmy to 2 razy, spróbujcie sami 🙂

Odpalcie wirtualne środowisko, wykonajcie komendę: pip install gunicorn, ale nie deaktywujcie środowiska, mamy do wykonania jeszcze jedną czynność.

Punkt nr 3, czyli requirements.txt. Możemy go napisać ręcznie, sprawdzić jakie moduły są zainstalowane, jakie mają wersje etc., ale po co? Flask zrobi to za nas 🙂

W aktywowanym środowisko wirtualnym wpisujemy komendę:

pip freeze > requirements.txt

Plik requirements.txt zostanie utworzony automatycznie. Zaraz po tym możecie deaktywować środowisko

Kolejnym punktem jest stworzenie pliku Procfile, który umożliwi rozpoznanie Heroku, gdzie znajduje się nasza aplikacja i jaki moduł ją obsługuje.

W katalogu głównym stwórzcie plik pod nazwą Procfile

Procfile

web gunicorn main:app

web gunicron – wskazuje na moduł, który uruchomi aplikację, czyli stworzy wirtualny serwer w chmurze

main:app – wskazuje modułowi Gunicorn, że nasz core aplikacji jest w pliku main.py, pod zmienna app, czyli dokładnie tutaj:

app = Flask(__name__)

Pozostaje teraz zrobić push na Heroku, ale po kolei:

Nie wrzucajmy na serwer pliku testów, ani wirtualnego środowiska. Wrzućcie pliki Procfile oraz requirements.txt do katalogu core aplikacji, czyli application, ponieważ tylko te pliki trafią na Heroku.

Przejdźmy terminalem do naszego folderu głównego czyli appliaction: 

cd appliaction

Zalogujmy się do naszego konta Heroku przez terminal, aby uruchomić w Heroki CLI. W terminalu wpisujemy komendę:

heroku login

Dostaniecie informację o próbie logowania:

heroku: Press any key to open up the browser to login or q to exit: 

Oczywiście klikacie cokolwiek poza q

Przejdziecie do strony logowania, po czym będziecie już połączenie z kontem i możecie spokojnie delopyować aplikację 🙂

Inicjujemy repozytorium GITa, poprzez:

git init

Musimy połączyć się ze zdalnym repozytorium na Heroku, co wygląda następująco:

heroku git:remote -a your-project-name

your-project-name, to oczywiście nazwa Waszej aplikacji, jeśli postępowaliście zgodnie z tutorialem, będzie to serach-jobs-app

Jedyne co pozostaje to zrobić deploy, czyli push na Heroku i nasza aplikacja będzie działać 🙂

git add .
git commit -m "files"
git push heroku master

To ostatnia komenda, po niej zobaczycie w terminalu, że projekt został zbudowany z powodzeniem odpalony:

Możecie kliknąć w link, lub wpisać:

heroku open

Działa? Pewnie że działa!

Wyszukuje? Wyszukuje!

Podsumowując:

  1. Nauczyliśmy się instalować oraz korzystać z frameworka Flask
  2. Potrafimy już instalować i dodawać moduły
  3. Napisaliśmy i przetestowaliśmy funkcje, które łączą się z GitHub API
  4. Stworzyliśmy formularze, dzięki czemu użytkownik może wyszukiwać oferty pracy na całym świecie (o ile istnieją)
  5. Na koniec odpaliliśmy aplikację w chmurze Heroku!

Było trudno? Myślę, że nie, ale jeśli potrzebujecie pomocy, lub macie pytania, walcie śmiało 🙂

Mam wielką nadzieję, że ten tutorial pomógł Wam zrozumieć jak działa Flask i pokazał jak łatwo można z nim zbudować podstawową wersję aplikacji. Możecie ją rozwijać wedle Waszego upodobania, może warto dodać dodatkowe filtry, lub dodatkowe opcje wyszukiwania, a nawet dodatkowe informacje w kontenerze oferty, które znajdziecie w JSON.

Wszystko zależy od Was!

Niedługo kolejne aplikacje, obserwujcie social media i blog! 🙂