Jump to content
hades

[Python] Doua cuvinte despre Mock Tests

Recommended Posts

Posted

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 Python

Pentru folosirea Mock Testelor in Python va puteti folosi de package-ul Mock. Il instalati usor cu:

pip install mock

Dar, 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()
>>>

  • Upvote 1
Posted

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.

  • Active Members
Posted

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.

Posted (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 by hades

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...