hades Posted May 30, 2014 Report Posted May 30, 2014 Pentru inceput: Testele, sunt o parte importanta a unei aplicatii. Cu ajutorul lor reusesti sa-ti refactorizezi codul, motiv pentru care TDD (Test Driven Development) este incurajat, dar in acelasi timp, mai greu de pus in practica.Oricum, aici nu voi vorbi de TDD sau alte metode, ci voi scrie putin despre Mock Tests.Ce sunt Mock Testele?Ei bine, Mock Testele, sunt testele automate care folosesc obiecte de tip Mock; Obiecte construite pentru a simula obiecte deja existente in codul vostru. Mock Testele sunt folosite in deosebi in momentul in care aplicatia voastra comunica cu surse externe, surse care ofera reply-uri diferite la request-uri.Mock Testele si PythonPentru folosirea Mock Testelor in Python va puteti folosi de package-ul Mock. Il instalati usor cu:pip install mockDar, sa trecem la niste exemple, pentru a vedea mai usor modul in care mock-ul este folosit in cod.1. Sa presupunem ca avem urmatoarea clasa:>>> class A():... def now(self):... return datetime.datetime.now()... >>>O instanta a clasei A se va putea folosi de metoda now pentru a returna data curenta.>>> instance = A()>>> instance.now()datetime.datetime(2014, 5, 30, 17, 9, 51, 47591)>>>In cazul unui test, vom dori ca metoda now() sa returneze o valoare constanta, tinand cont ca in momentul de fata la fiecare rulare a testului vom avea o data noua.Aici sunt cateva exemple:Ex1: Definim o metoda noua in cadrul testului nostru mock_now() care sa returneze aceiasi valoare indiferent cand testul este rulat:>>> def mock_now(x ):... return datetime(2014, 4, 9, 11, 50, 6, tzinfo=utc)... >>>Apoi, cu ajutorul decoratorului patch, vom spune ca metoda now() a clasei A() sa fie inlocuita cu noua metoda mock_now().>>> @patch('fisier.cu.clasa.A.now', mock_now)... def test_method(self):... testInstance = A()... return testInstance.now()>>>In acest mod, testInstance.now() va returna (2014, 4, 9, 11, 50, 6, tzinfo=utc)Ex2: Se poate mockui metoda now() si fara definirea unei noi metode; Tot cu ajutrul decoratorului patch:>>> def test_method(self):... with patch('fisier.cu.clasa.A.now') as mock_stuff:... mock_stuff.return_value = datetime(2014, 4, 9, 11, 50, 6, tzinfo=utc)... testInstance = A()... return testInstance.now()>>>Ex3: In ultimul exemplu de mockuire al metodei, voi isntantia un obiect de tip Mock().>>> def test_method(self):... testInstance = A()... testInstance.now = Mock()... testInstance.now.return_value = datetime(2014, 4, 9, 11, 50, 6, tzinfo=utc)... return testInstance.now()>>> 1 Quote
tromfil Posted April 29, 2015 Report Posted April 29, 2015 Foarte mi?to, mai ales c? Python începe s? prind? pe web destul de bine în ultima vreme. Quote
hades Posted April 29, 2015 Author Report Posted April 29, 2015 Fast & Reliable web apps.Frameworkuri ca si Flask, Bottle pentru mini-webservere sau pentru aplicatii mai masive Django, te-ajuta sa scoti la viata aplicatii destul de inteligente. Quote
Active Members MrGrj Posted April 29, 2015 Active Members Report Posted April 29, 2015 Pentru cine e interesat, de mentionat mai este faptul ca de multe ori, scrii mai mult cod pentru Mock Tests decat cod pentru aplicatie in sine. Quote
hades Posted April 29, 2015 Author Report Posted April 29, 2015 (edited) Pentru cine e interesat, de mentionat mai este faptul ca de multe ori, scrii mai mult cod pentru Mock Tests decat cod pentru aplicatie in sine.De cele mai multe ori, scrii mai mult cod pentru teste in general, decat pentru codebase-ul testat. Dar ajuta foarte mult in momentul in care te-ntorci si vrei sa faci refactoring. Edited April 29, 2015 by hades Quote