1. Håll testerna på lagom nivå
Det är viktigt att ha en balans mellan hur lång tid det tar att skriva testerna och nyttan de ger. Att göra tester för unika särskilda fall som är väldigt invecklade är inte rekommenderat om det inte funktionaliteten är extremt viktigt för applikationen. Det finns olika program för att räkna ut coverage men det finns ingen siffra specifikt att uppnå. Det är helt beroende på från applikationen som utvecklas. Vissa kräver mer grundläggande och omfattande testning medan andra är agila där funktionalitet ändras ofta och tester endast behöver täcka grundfunktionaliteten.
2. Factories, factories, factories
Börja med factories redan när du gör modellerna för ditt projekt. Vissa har t.o.m. skapat skript som automatiskt skriver factories för modelen som man skapar. Vad är Factories kan man fråga? Factories skapar testdata som används i testerna. Ett enkelt sätt att skapa factories är att ha modellerna öppna bredvid och skapa slumpad testdata för varje fält i modellerna för Django appen. Nedan är ett exempel ur factories.py som skapar en användare:
Pythonclass UserFactory:
@classmethod
def create(cls, *args, **kwargs):
return User.objects.create(*args, **kwargs)
@classmethod
def create_dummy(cls):
payload = {
'email': 'Pelle{}@svanslos.com'.format(random.random()),
'first_name': 'Pelle',
'last_name': 'Svanslos',
'is_active': True,
}
return cls.create(**payload)
Denna lilla kodsnutt gör att vi i testfilerna enkelt kan åberopa denna funktion och få en användare returnerad.
OBS! Glöm inte lägga till andra fält som är nödvändiga om ni har modifierat Djangos standard UserModel.
3. Dela upp testerna
För att förenkla och organisera testerna bör man skapa olika testfiler för testandet av models, views, resources etc.
Skapa sedan setUp funktionen som skapar den nödvändig data som testet är beroende av. Test om ett best behöver en instans av UserModelen kan vi ropa på vår factories funktion ovan och skapa så många användare vi behöver i setUp funktionen. Då många använder Django som ett Rest-API med hjälp av Django Rest Framework kan man i setUp funktionen göra authencieringen också.
4. Testa med hjälp av Django tester
Många utvecklare sitter med webbläsaren och Postman (eller liknande applikation för POST/PUT/PATCH-request) öppna samtidigt för att testa koden de precis skrivit. Varför inte skriva Django testscenarion direkt för ny funktionalitet? Detta gör att du slipper slösa tid på att sätta in dig igen i koden. Du går på detta sätt igenom funktionaliteten igen och säkerställer att koden uppfyller den kravspec du fått. Återigen vill vi påminna om vikten av att hitta balansen mellan hur mycket tester man skriver kontra hur lång tid det tar att skriva dessa. Genom att skriva tester för den grundläggande funktionaliteten i ett tidigt stadie och kontinuerligt skriva nya tester när ny funktionalitet implementeras så kommer du hålla en hög kodkvalité och minska risken för fel.
5. Automatisera testerna
Automatiserad testning säkerställer att all kod som skrivs passerer de funktionella testerna som skrivits i projektet. Detta bidrar till ökad kvalité på applikationen och minskar riskerna för att ny kod ska förstöra essentiella funktioner. Ett exempel på automatiserad testning är CircleCI. Genom att integrerar det med ert Git-verktyg kan du säkerställa att all kod genomgått och passerat testningen innan det migrerats in i projektets kodbas. Sätt upp en lösning för automatiserad testkörning tidigt i projektet så underlättar du för dig själv och dina kollegor.
Håller du med ovanstående? Har du andra tips som vi borde lägga till? Tveka inte att höra av dig!
Har du ett Django projekt som saknar tester och vill komma igång med det? Boka gärna ett förutsättningslöst möte för att prata mer om det.