A fájlrendszer gúnyolódik a Jimfs-sel

1. Áttekintés

Általában az I / O műveleteket nagy mértékben kihasználó komponensek tesztelésekor tesztjeink számos problémát szenvedhetnek, például gyenge teljesítmény, platformfüggőség és váratlan állapot.

Ebben az oktatóanyagban megnézzük, hogyan oldhatjuk meg ezeket a problémákat a memóriában lévő Jimfs fájlrendszerrel.

2. Bevezetés a Jimfs-be

A Jimfs egy memóriában lévő fájlrendszer, amely a Java NIO API-t valósítja meg és szinte minden funkcióját támogatja. Ez különösen hasznos, mivel azt jelenti, hogy a memóriában lévő virtuális fájlrendszert utánozhatjuk, és a meglévő rendszerünkkel kölcsönhatásba léphetünk vele java.nio réteg.

Amint látni fogjuk, előnyös lehet, ha a valóságos helyett csúfolt fájlrendszert használunk a következők érdekében:

  • Kerülje el, hogy függjen a tesztet futtató fájlrendszertől
  • Győződjön meg arról, hogy a fájlrendszer minden tesztfutás során összeáll a várt állapottal
  • Segítsen felgyorsítani tesztjeinket

Mivel a fájlrendszerek jelentősen eltérnek, a Jimfs használata megkönnyíti a tesztelést a különböző operációs rendszerek fájlrendszereivel is.

3. Maven-függőségek

Először tegyük hozzá a példákhoz szükséges projektfüggőségeket:

 com.google.jimfs jimfs 1.1 

A jimfs függőség mindent tartalmaz, amire szükségünk van a csúfolt fájlrendszer használatához. Ezenkívül teszteket írunk a JUnit5 használatával.

4. Egyszerű fájltár

Kezdjük egy egyszerű meghatározásával FileRepository osztály, amely néhány standard CRUD műveletet hajt végre:

public class FileRepository {void create (elérési útvonal, karakterlánc fájlnév) {elérési út fájlútvonal = elérési út.resolve (fájlnév); próbáld ki a {Files.createFile (filePath) fájlt; } catch (IOException ex) {dobja be az új UncheckedIOException (ex); }} Karaktersorozat olvasása (elérési út) {try {return new String (Files.readAllBytes (path)); } catch (IOException ex) {dobja be az új UncheckedIOException (ex); }} Karaktersorozat frissítése (elérési út, String newContent) {próbáld ki {Files.write (elérési út, newContent.getBytes ()); return newContent; } catch (IOException ex) {dobja be az új UncheckedIOException (ex); }} void delete (elérési útvonal) {try {Files.deleteIfExists (elérési út); } catch (IOException ex) {dobja be az új UncheckedIOException (ex); }}}

Mint láthatjuk, mindegyik módszer szabványt alkalmaz java.nio osztályok.

4.1. Fájl létrehozása

Ebben a szakaszban írunk egy tesztet, amely teszteli a teremt módszer a tárunkból:

@Test @DisplayName ("Fájlt kell létrehoznia egy fájlrendszeren") void givenUnixSystem_whenCreatingFile_thenCreatedInPath () {FileSystem fileSystem = Jimfs.newFileSystem (Configuration.unix ()); String fileName = "newFile.txt"; Elérési útvonalToStore = fileSystem.getPath (""); fileRepository.create (pathToStore, fileName); assertTrue (Files.exists (pathToStore.resolve (fileName))); }

Ebben a példában a statikus módszer Jimfs.newFileSystem () hogy létrehozzon egy új memóriában lévő fájlrendszert. Átadunk egy konfigurációs objektumot Configuration.unix (), amely megváltoztathatatlan konfigurációt hoz létre a Unix fájlrendszerhez. Ez magában foglalja az operációs rendszerre vonatkozó fontos információkat, például az útvonalelválasztókat és a szimbolikus linkekre vonatkozó információkat.

Most, hogy létrehoztunk egy fájlt, ellenőrizhetjük, hogy a fájlt sikeresen hozták-e létre a Unix-alapú rendszeren.

4.2. Fájl olvasása

Ezután teszteljük a fájl tartalmát olvasó módszert:

@Test @DisplayName ("Olvassa el a fájl tartalmát") void givenOSXSystem_whenReadingFile_thenContentIsReturned () dobja a Kivételt {FileSystem fileSystem = Jimfs.newFileSystem (Configuration.osX ()); Path resourceFilePath = fileSystem.getPath (RESOURCE_FILE_NAME); Files.copy (getResourceFilePath (), resourceFilePath); Karaktersorozat = fileRepository.read (resourceFilePath); assertEquals (FILE_CONTENT, tartalom); }

Ezúttal megvizsgáltuk, hogy elolvasható-e a fájl tartalma a macOS (korábban OSX) rendszer egyszerűen más típusú konfiguráció használatával - Jimfs.newFileSystem (Configuration.osX ()).

4.3. Fájl frissítése

A Jimfs segítségével tesztelhetjük a fájl tartalmát frissítő módszert is:

@Test @DisplayName ("Frissítenie kell a fájl tartalmát") void givenWindowsSystem_whenUpdatingFile_thenContentHasChanged () dobja a Kivételt {FileSystem fileSystem = Jimfs.newFileSystem (Configuration.windows ()); Path resourceFilePath = fileSystem.getPath (RESOURCE_FILE_NAME); Files.copy (getResourceFilePath (), resourceFilePath); String newContent = "Frissítlek."; Karakterlánc tartalma = fileRepository.update (resourceFilePath, newContent); assertEquals (newContent, content); assertEquals (newContent, fileRepository.read (resourceFilePath)); }

Hasonlóképpen, ezúttal megvizsgáltuk, hogyan viselkedik a módszer a Windows-alapú rendszer használatával Jimfs.newFileSystem (Configuration.windows ()).

4.4. Fájl törlése

A CRUD műveletek tesztelésének befejezéséhez teszteljük a fájlt törlő módszert:

@Test @DisplayName ("Törölni kell a fájlt") void givenCurrentSystem_whenDeletingFile_thenFileHasBeenDeleted () dobja a Kivételt {FileSystem fileSystem = Jimfs.newFileSystem (); Path resourceFilePath = fileSystem.getPath (RESOURCE_FILE_NAME); Files.copy (getResourceFilePath (), resourceFilePath); fileRepository.delete (resourceFilePath); assertFalse (Files.exists (resourceFilePath)); }

A korábbi példákkal ellentétben mi használtuk Jimfs.newFileSystem () fájlrendszer-konfiguráció megadása nélkül. Ebben az esetben a Jimfs létrehoz egy új memóriában lévő fájlrendszert, amelynek alapértelmezett konfigurációja megfelel az aktuális operációs rendszernek.

5. Fájl áthelyezése

Ebben a szakaszban megtudhatjuk, hogyan tesztelhetünk egy módszert, amely egy fájlt egyik könyvtárból a másikba mozgat.

Először hajtsuk végre a mozog módszer a szabvány segítségével java.nio.file.File osztály:

void move (elérési út, útvonal cél) {try {Files.createDirectories (cél); Files.move (origó, cél, StandardCopyOption.REPLACE_EXISTING); } catch (IOException ex) {dobja be az új UncheckedIOException (ex); }}

Paraméteres tesztet fogunk használni annak biztosítására, hogy ez a módszer több különböző fájlrendszeren működjön:

privát statikus adatfolyam Streaming newFileSystem (Configuration.osX ()))); } @ParameterizedTest @DisplayName ("Áthelyeznie kell a fájlt új rendeltetési helyre") @MethodSource ("nodrošinātFileSystem") void givenEachSystem_whenMovingFile_thenMovedToNewPath (FileSystem fileSystem) kivételt dob: {Path origin = fileSystem.getPath (RESOURCE_F) Files.copy (getResourceFilePath (), eredet); Útvonal rendeltetési hely = fileSystem.getPath ("newDirectory", RESOURCE_FILE_NAME); fileManipulation.move (eredet, rendeltetési hely); assertFalse (Fájlok.létezik (eredet)); assertTrue (Fájlok.létezik (cél)); }

Mint láthatjuk, a Jimfs segítségével azt is tesztelhettük, hogy egyetlen egység tesztből különféle fájlrendszereken mozgathatunk fájlokat.

6. Az operációs rendszertől függő tesztek

A Jimfs használatának egy másik előnyének bemutatásához hozzunk létre egy FilePathReader osztály. Az osztály felelős a valódi rendszerpálya visszaadásáért, amely természetesen operációs rendszertől függ:

class FilePathReader {Karakterlánc getSystemPath (elérési útvonal) {try {visszatérési út .toRealPath () .toString (); } catch (IOException ex) {dobja be az új UncheckedIOException (ex); }}}

Most adjunk hozzá egy tesztet ehhez az osztályhoz:

class FilePathReaderUnitTest {privát statikus karakterlánc DIRECTORY_NAME = "baeldung"; privát FilePathReader filePathReader = új FilePathReader (); @Test @DisplayName ("Útvonalat kell kapnia a Windows-on") void givenWindowsSystem_shouldGetPath_thenReturnWindowsPath () dobja a Kivételt {FileSystem fileSystem = Jimfs.newFileSystem (Configuration.windows ()); Elérési útvonal = getPathToFile (fileSystem); String stringPath = filePathReader.getSystemPath (elérési út); assertEquals ("C: \ work \" + DIRECTORY_NAME, stringPath); } @Test @DisplayName ("Útvonalat kell kapnia az unix-en") void givenUnixSystem_shouldGetPath_thenReturnUnixPath () dobja a Kivételt {FileSystem fileSystem = Jimfs.newFileSystem (Configuration.unix ()); Elérési útvonal = getPathToFile (fileSystem); String stringPath = filePathReader.getSystemPath (elérési út); assertEquals ("/ work /" + DIRECTORY_NAME, stringPath); } privát útvonal a getPathToFile (FileSystem fileSystem) dobja a {Kiválasztási útvonal = fileSystem.getPath (DIRECTORY_NAME) kivételt; Files.createDirectory (elérési út); visszatérési útvonal; }}

Amint láthatjuk, a Windows kimenete eltér a Unixétól, amint azt vártuk. Ráadásul, nem kellett két különböző fájlrendszerrel futtatnunk ezeket a teszteket - Jimfs automatikusan gúnyolta nekünk.

Érdemes ezt megemlíteni Jimfs nem támogatja a fájlhoz() metódus, amely a java.io.Fájl. Ez az egyetlen módszer a Pálya osztály, amely nem támogatott. Ezért jobb lehet egy InputStream nem pedig a File.

7. Következtetés

Ebben a cikkben megtanultuk, hogyan használhatjuk a memóriában lévő Jimfs fájlrendszert a fájlrendszeri interakciók kigúnyolására az egység tesztjeinkből.

Először egy CRD művelettel rendelkező egyszerű fájltár definiálásával kezdtük. Ezután láttunk példákat arra, hogyan tesztelhetjük az egyes módszereket egy másik fájlrendszertípussal. Végül láttunk egy példát arra, hogyan használhatjuk a Jimfs-t az operációs rendszertől függő fájlrendszer-kezelés tesztelésére.

Mint mindig, ezeknek a példáknak a kódja elérhető a Github oldalon.