Conforme ressalta Percival (2017), utilizar o estilo de programação do TDD pode não ser algo que surja naturalmente e é importante não desistir quando surgirem as primeiras dificuldades e/ou dúvidas quanto ao seu uso.
A ideia geral é de que nada seja feito sem que exista um teste para verificar o funcionamento de tudo. Por exemplo, sabendo que nossa aplicação irá executar no django, podemos redigir um teste para nos certificarmos de que o django esteja ativo e pronto para ser utilizado.
Para isso, podemos escrever um teste conforme apresentado abaixo:
from selenium import webdriverbrowser = webdriver.Firefox()browser.get("http://localhost:8000")assert'worked successfully'in browser.title
Esse teste deve ser salvo num arquivo functional_tests.py dentro da pasta $HOME/tdd/superlists.
Feito isso, é possível executar o teste com o comando abaixo:
(superlists) tdd@mlp:~/superlists$pythonfunctional_tests.pyTraceback (most recentcalllast):File"/home/tdd/superlists/functional_tests.py",line4,in<module>browser.get("http://localhost:8000") File "/home/tdd/.pyenv/versions/superlists/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 363, in get
self.execute(Command.GET,{"url":url}) File "/home/tdd/.pyenv/versions/superlists/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 354, in execute
self.error_handler.check_response(response) File "/home/tdd/.pyenv/versions/superlists/lib/python3.10/site-packages/selenium/webdriver/remote/errorhandler.py", line 229, in check_response
raiseexception_class(message,screen,stacktrace)selenium.common.exceptions.WebDriverException: Message: Reached error page: about:neterror?e=connectionFailure&u=http%3A//localhost%3A8000/&c=UTF-8&d=Firefox%20can%E2%80%99t%20establish%20a%20connection%20to%20the%20server%20at%20localhost%3A8000.
Stacktrace:RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:193:5UnknownError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:832:5checkReadyState@chrome://remote/content/marionette/navigate.sys.mjs:58:24onNavigation@chrome://remote/content/marionette/navigate.sys.mjs:330:39emit@resource://gre/modules/EventEmitter.sys.mjs:148:20receiveMessage@chrome://remote/content/marionette/actors/MarionetteEventsParent.sys.mjs:33:25
A execução do teste causa a abertura de uma janela do Firefox com uma mensagem de erro, conforme ilustrado abaixo:
Como era de se esperar, o teste falhou, exatamente por não conseguir encontrar uma instância ativa do django em execução.
Fazendo o teste passar
Para fazermos o teste passar é necessário colocarmos uma instância do django em execução. Para isso, o primeiro passo é a criação de um projeto que será o contêiner principal de nosso site. A criação de um projeto em django pode ser feita com a ferramenta django-admin. O comando abaixo, executado dentro da pasta superlists do nosso ambiente virtual, irá criar esse projeto para nós.
Em caso de sucesso, o comando não emite qualquer saída, mas irá criar um subdiretório superlists abaixo do diretório corrente. Parte da estrutura de diretórios do ambiente virtual com o projeto do django fica conforme apresentado na figura abaixo:
Para inicializar o servidor django, basta executar o comando manage.py, conforme ilustrado abaixo, dentro do ambiente virtual.
(superlists) tdd@mlp:~/superlists$cdsuperlists/(superlists) tdd@mlp:~/superlists/superlists$pythonmanage.pyrunserverWatchingforfilechangeswithStatReloaderPerformingsystemchecks...Systemcheckidentifiednoissues (0 silenced).You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run'python manage.py migrate'toapplythem.June22,2024-09:17:04Djangoversion5.0.6,usingsettings'superlists.settings'Startingdevelopmentserverathttp://127.0.0.1:8000/QuittheserverwithCONTROL-C.
No exemplo acima, o django alerta que é necessário executar um comando para fazer a migração do projeto.
Quando você cria um novo projeto Django, ele já vem com várias aplicações padrão, como admin, auth, contenttypes e sessions. Cada uma dessas aplicações tem suas próprias tabelas e relações no banco de dados. As migrações para essas tabelas já existem, mas ainda não foram aplicadas ao banco de dados. Para aplicar essas migrações, pressionamos CONTROL-C para interromper a execução do servidor e, em seguida, executamos o comando indicado abaixo.
Agora com o servidor no ar é possível reexecutar o teste para verificar se o mesmo passa. Para isso, basta abrir um novo terminal, se conectar ao ambiente virtual, entrar no diretório superlists (primeiro nível) e executar o comando para a execução, conforme abaixo:
Como consequência da execução, será aberta uma janela do Firefox mas desta vez o servidor django será encontrado e o teste irá se comportar conforme o esperado.