Adatbázis-tesztelési útmutató

⚡ Okos összefoglaló

Az adatbázis-tesztelés minden modern alkalmazás mögött álló sémát, táblázatot, triggert és tárolt eljárást validál, biztosítva az adatok integritását és konzisztenciáját. Ez a cikk ismerteti a strukturális, funkcionális és nem funkcionális adatbázis-tesztelést, valamint az eszközöket, a gyakori buktatókat és a bevált legjobb gyakorlatokat.

  • 🗄️ Alapelv: Az adatbázis-tesztelés ellenőrzi a háttérrendszert, amely az üzletileg kritikus adatokat tárolja – azokat, amelyeket a felhasználók soha nem látnak, de mindig támaszkodnak rájuk.
  • 🎯 Lefedettségi fókusz: A strukturális tesztelés a sémát, kulcsokat, indexeket, tárolt eljárásokat és triggereket ellenőrzi; a funkcionális tesztelés az adatok integritását és biztonságát; a nem funkcionális tesztelés a terhelést és a stresszt.
  • 📊 Teljesítményinformációk: A terheléses és stressztesztek számszerűsítik a kockázatot, és feltárják az érdekelt felek válaszidő-elvárásainak teljesítéséhez szükséges minimális hardvert.
  • 🇧🇷 Szerszámozási stratégia: Kombinálja az SQL-alapú tesztelőeszközöket, a teljesítménynövelő csomagokat, mint például a LoadRunner és JMeterés az olyan egységkeretrendszerek, mint a DBUnit a réteges lefedettség érdekében.
  • ???? Legjobb gyakorlat: Minden követelményt ellenőrizni kell az adatbázissal szemben a következő módszerrel: trachasználható tesztesetek, és adatok biztonsági mentése destruktív forgatókönyvek, például stressztesztek előtt.

Adatbázis tesztelése

Az adatbázis-tesztelés – más néven backend vagy adattesztelés – az, ami minden alkalmazás láthatatlan felét őszintén tartja. Ez az oktatóanyag bemutatja, hogy mit fed le, miért fontos, a három fő tesztelési kategóriát, a gyakori buktatókat és a legjobb gyakorlatokat, amelyek megkülönböztetik a megbízható és a szivárgó csomagokat.

Mi az adatbázis tesztelés?

Adatbázis tesztelése egy olyan szoftvertesztelési típus, amely validálja a tesztelt adatbázis sémáját, táblázatait, triggereit, tárolt eljárásait és egyéb objektumait. Emellett ellenőrzi az adatok integritását, konzisztenciáját és biztonságát is. Az adatbázis-tesztelés gyakran összetett lekérdezések írását foglalja magában az adatbázis betöltésére vagy terheléstesztelésére, valamint a válaszidejének mérésére.

Adatbázis-tesztelés áttekintése

Miért fontos az adatbázis tesztelése?

Az adatbázis-tesztelés kritikus fontosságú szoftver tesztelés mert megerősíti, hogy az adatbázisban tárolt és onnan visszakeresett értékek érvényesek. Az erős adatbázis-tesztelés megakadályozza az adatvesztést, tartalmazza a megszakított tranzakciókat, és blokkolja az információkhoz való jogosulatlan hozzáférést. Mivel az adatbázis minden üzleti alkalmazás lelke, a tesztelőknek jártasnak kell lenniük az SQL használatában.

A legtöbb csapat a grafikus felhasználói felületre (GUI) összpontosít, mivel ez az alkalmazás legláthatóbb része. A grafikus felhasználói felület alatti információk ugyanilyen fontosak, és ezek validálása az adatbázis-tesztelés feladata. Vegyünk egy banki alkalmazást, amelyben a felhasználó tranzakciókat hajt végre. Adatbázis-tesztelési szempontból a következő invariánsoknak kell teljesülniük:

  1. Az alkalmazás minden tranzakciót tárol az adatbázisban, és helyesen jeleníti meg a felhasználónak.
  2. A művelet során semmilyen információ nem veszik el.
  3. A részben befejezett vagy megszakított műveletek nem kerülnek megőrzésre.
  4. Jogosulatlan személy nem férhet hozzá a felhasználó adataihoz.

Ezen invariánsok mindegyikének megerősítése az adatbázis-validáció és az adattesztelés célja.

A felhasználói felület tesztelése és az adattesztelés közötti különbségek

Felhasználói felület tesztelése vs adattesztelés

Felhasználói felület teszteléseAdatbázis / Adattesztelés
Grafikus felhasználói felület (GUI) tesztelésnek vagy front-end tesztelésnek is nevezik.Más néven backend tesztelés vagy adattesztelés.
A felhasználó számára látható és általa interakcióba lépő elemekre vonatkozik – űrlapok, prezentációk, grafikonok, menük és jelentések (VB, VB.NET, VB segítségével készültek).C++, Delphi és hasonló front-end eszközök).A felhasználó elől rejtett elemekre vonatkozik — belső folyamatokra és tárolókra, például adatbázis-kezelő motorokra (Oracle, SQL szerver, MySQL).
Tartalmazza a szövegmezők, legördülő menük, naptárak, gombok, oldalnavigáció, képmegjelenítés és az általános megjelenés érvényesítését.Magában foglalja a séma, táblák, oszlopok, kulcsok és indexek, tárolt eljárások, triggerek és adatbázis-kiszolgáló konfigurációjának érvényesítését.
A tesztelőnek üzleti ismeretekkel, valamint a fejlesztőeszközök és automatizálási keretrendszerek ismeretével kell rendelkeznie.A tesztelőnek erős háttérrel kell rendelkeznie az adatbázis-kiszolgálók és a strukturált lekérdezési nyelv (SQL) terén.

KAPCSOLÓDÓ CIKKEK

Az adatbázistesztelés típusai

Az adatbázistesztelés típusai

Az adatbázis-tesztelés három felső szintű kategóriára oszlik. Mindegyik az adatbázis-verem egy másik rétegét ellenőrzi.

  1. Szerkezeti vizsgálat
  2. Funkcionális tesztelés
  3. Nem funkcionális tesztelés

Strukturális adatbázis tesztelése

Strukturális adatbázis tesztelése validálja az adattárház azon elemeit, amelyeket tárolásra használnak, de a végfelhasználók közvetlenül nem manipulálnak. Az adatbázis-kiszolgálók validálása a strukturális tesztelés része. A sikeres végrehajtáshoz erős SQL-ismeretek szükségesek.

Mi az a séma tesztelés?

Sématesztelés érvényesíti az adatbázishoz társított sémaformátumokat, és ellenőrzi, hogy a térkép megfelel-e a követelményeknek.ping a táblák, nézetek és oszlopok száma megegyezik a térképpelping a felhasználói felület által elvárt. A cél a sématérkép biztosításaping a felhasználói felület és a háttér közötti konzisztencia. A sématesztelést más néven térképping tesztelés.

A séma tesztelésének főbb ellenőrzőpontjai:

  1. Érvényesítse az adatbázishoz társított összes sémaformátumot.ping A táblázat szintű formátumok gyakran eltérnek a felhasználói felület szintű formátumoktól.
  2. Ellenőrizze a nem leképezett táblák, nézetek vagy oszlopok meglétét.
  3. Ellenőrizze, hogy a környezetben található heterogén adatbázisok konzisztensek maradnak-e az alkalmazás általános térképével.ping.

Hasznos eszközök az adatbázis-sémák validálásához:

  • DBUnit Anttal integrálva — jól illeszkedik a térképhezping tesztelés.
  • SQL Server lehetővé teszi a tesztelők számára, hogy egyszerű lekérdezések írásával vizsgálják meg a sémát kód helyett.

Például, ha a fejlesztőcsapat módosít vagy eltávolít egy táblázatot, a tesztelő megerősíti, hogy minden tárolt eljárás és nézet, amely az adott táblázatra hivatkozik, kompatibilis a módosítással. Egy másik példa: két adatbázis sémabeli különbségeinek összehasonlításakor a rendszerkatalógussal szembeni egyszerű lekérdezések gyorsan elvégzik a munkát.

Adatbázis táblázat, oszlopos tesztelés

  1. Ellenőrizze, hogy a háttéradatbázis mezői és oszlopai egyértelműen megfeleltethetők-e a felhasználói felület megfelelőinek.
  2. Ellenőrizd az adatbázismezők és -oszlopok hosszát és elnevezési konvencióit a követelményeknek megfelelően.
  3. Észlelje a nem használt vagy nem leképezett táblákat és oszlopokat.
  4. Ellenőrizze, hogy a háttéroszlopok adattípusa és mezőhossza kompatibilis-e az előtér űrlapmezőkével.
  5. Győződjön meg arról, hogy az adatbázis mezői elfogadják az üzleti követelményspecifikáció által megkövetelt felhasználói bemeneteket.

Kulcsok és indexek tesztelése

  1. Ellenőrizze, hogy a szükséges elsődleges kulcs és a idegen kulcs korlátozások vannak a szükséges táblákra vonatkozóan.
  2. Győződjön meg arról, hogy az idegen kulcshivatkozások érvényes rekordokra mutatnak.
  3. Ellenőrizd, hogy az elsődleges kulcs adattípusa megegyezik-e a kapcsolódó táblákban található megfelelő idegen kulcsok adattípusával.
  4. Győződjön meg arról, hogy a kulcsok és indexek elnevezési konvenciói megfelelnek a projekt szabványainak.
  5. Érvényesítse az indexelt mezők méretét és hosszát.
  6. Ellenőrizze, hogy a szükséges fürtözött és a nem klaszterezett indexek a követelmények által meghatározott táblákon jönnek létre.

Tárolt eljárások tesztelése

  1. Győződjön meg arról, hogy a fejlesztőcsapat minden modulban minden tárolt eljárás esetében betartotta a szükséges kódolási konvenciókat, kivételkezelést és hibakezelést.
  2. Ellenőrizd, hogy a tesztelés során megadott bemeneti adatok minden feltételt és ciklust végrehajtanak-e.
  3. Győződjön meg arról, hogy a TRIM művelet minden alkalommal alkalmazásra kerül, amikor adatokat kér le a szükséges táblákból.
  4. Manuálisan hajtsa végre az egyes tárolt eljárásokat, és ellenőrizze, hogy az eredmény megfelel-e a várakozásoknak.
  5. Győződjön meg arról, hogy a manuális végrehajtás frissíti az alapul szolgáló táblamezőket a tesztelt alkalmazás követelményeinek megfelelően.
  6. Ellenőrizze, hogy a tárolt eljárások végrehajtása implicit módon meghívja-e a szükséges triggereket.
  7. Észlelje a nem használt tárolt eljárásokat.
  8. NULL bemenetek viselkedésének validálása adatbázis szinten.
  9. Győződjön meg arról, hogy minden tárolt eljárás és függvény sikeresen végrehajtódik, amikor a tesztelt adatbázis üres.
  10. A tárolt eljárásmodulok teljes körű integrációjának validálása az alkalmazáskövetelményekkel szemben.

A tárolt eljárások teszteléséhez hasznos eszközök a következők: LINQ és a SP-teszt hasznosság.

Trigger tesztelése

  1. Ellenőrizze, hogy a trigger fejlesztése során betartották-e a szükséges kódolási konvenciókat.
  2. Győződjön meg arról, hogy a kívánt DML tranzakcióknál és csak azoknál aktiválódik a indítás.
  3. Ellenőrizze, hogy a trigger megfelelően frissíti-e az adatokat az indítás után.
  4. Ellenőrizd a szükséges frissítési, beszúrási és törlési trigger funkciókat a tesztelt alkalmazáson belül.

Adatbázis szerver ellenőrzések

Adatbázis szerver ellenőrzések

  1. Ellenőrizze az adatbázis-kiszolgáló konfigurációját az üzleti követelmények alapján.
  2. Győződjön meg arról, hogy a felhasználó csak az alkalmazás által engedélyezett műveletekhez van jogosultsága.
  3. Ellenőrizze, hogy az adatbázis-kiszolgáló képes-e kezelni a követelményekben meghatározott maximális egyidejű felhasználói tranzakció terhelést.

Funkcionális adatbázis tesztelése

Funkcionális adatbázis tesztelése A végfelhasználó szemszögéből ellenőrzi az adatbázis funkcionális követelményeit. Célja annak megerősítése, hogy a végfelhasználó által elindított tranzakciók és műveletek az adatbázis szintjén a várt módon viselkednek.

Az adatbázis-validáció során ellenőrizendő alapvető feltételek:

  • Azt jelzi, hogy minden mező kötelező-e, vagy NULL értékeket is elfogad.
  • Vajon minden mező elegendő hosszúságot biztosít-e a várt adatokhoz.
  • Hogy a szemantikailag hasonló mezők ugyanazt a nevet használják-e a táblákban.
  • Léteznek-e számított mezők az adatbázisban, és milyen képleteket alkalmaznak.

Ez az ellenőrzés mindkét irányban fut. A tesztelő végrehajt egy műveletet az adatbázis szintjén, és ellenőrzi azt a felhasználói felületen, majd végrehajt egy műveletet a felhasználói felületen, és ellenőrzi azt az adatbázis szintjén.

Az adatok integritásának és konzisztenciájának ellenőrzése

  1. Ellenőrizd, hogy az adatok logikusan vannak-e rendszerezve.
  2. Győződjön meg arról, hogy a tárolt adatok megfelelnek az üzleti követelményeknek.
  3. Észlelje a felesleges adatokat a tesztelt alkalmazásban.
  4. Ellenőrizze, hogy a felhasználói felületről frissített adatok helyesen kerülnek-e be az adatbázisba.
  5. A beszúrás előtt ellenőrizze a TRIM műveleteket az adatokon.
  6. Ellenőrizd, hogy minden tranzakció megfelel-e az üzleti specifikációnak, és a várt eredményt hozza-e.
  7. A tranzakciók befejezése után erősítse meg a sikeres véglegesítéseket.
  8. A helyes visszagörgetés megerősítése sikertelen tranzakció esetén.
  9. A heterogén adatbázisokat átívelő tranzakciók helyes visszagörgetésének megerősítése.
  10. Ellenőrizze, hogy minden tranzakció a rendszerkövetelményekben meghatározott tervezési eljárásokat követi-e.

Bejelentkezés és felhasználói biztonság

  1. Ellenőrizze, hogy az alkalmazás blokkolja-e a bejelentkezési kísérleteket a következő esetekben: (a) érvénytelen felhasználónév + érvényes jelszó, (b) érvényes felhasználónév + érvénytelen jelszó, és (c) érvénytelen felhasználónév + érvénytelen jelszó.
  2. Győződjön meg arról, hogy minden felhasználó csak a szerepkörében meghatározott műveleteket hajthatja végre.
  3. Győződjön meg arról, hogy az érzékeny adatok védve vannak a jogosulatlan hozzáféréstől.
  4. Győződjön meg arról, hogy léteznek különálló felhasználói szerepkörök, amelyek különálló engedélykészletekkel rendelkeznek.
  5. Ellenőrizze, hogy minden felhasználó rendelkezik-e az üzleti követelményekben meghatározott hozzáférési szinttel.
  6. Győződjön meg arról, hogy az érzékeny adatok – jelszavak, hitelkártyaszámok, személyes azonosítók – titkosítva vannak inaktív állapotban, és soha nem kerülnek egyszerű szövegként tárolásra. Minden fióknak összetett, nehezen kitalálható jelszavakat kell használnia.

Nem funkcionális tesztelés

Nem funkcionális tesztelés adatbázis-környezetben lefedi terhelés tesztelése, stresszteszt, biztonsági tesztelés, használhatóság teszteléseés kompatibilitási tesztelésA terheléses és stressztesztelés – mindkét teljesítménytesztelési forma – két konkrét célt szolgál:

  • Kockázatszámítás: A kockázat számszerűsítése segít az érdekelt feleknek meghatározni a rendszer válaszidejét meghatározott terhelési szintek mellett. Ez minden projekt alapvető célja. minőségbiztosítás erőfeszítés. A terheléstesztelés nem csökkenti közvetlenül a kockázatot, hanem felszínre hozza azt, és ösztönzést ad a korrekcióra.
  • Minimális hardverkövetelmény: A teljesítménytesztelés azonosítja a megadott teljesítményelvárások teljesítéséhez szükséges minimális infrastruktúrát, lehetővé téve a csapatok számára, hogy elkerüljék a hardverek túlzott kiépítését és a tulajdonlási költségek felfújását.

Terhelésvizsgálat

Minden terheléses teszt célját világosan meg kell érteni és dokumentálni kell. A következő konfigurációk kötelezőek a következőkhöz: terhelés tesztelése:

  1. Tartalmazza a leggyakrabban végrehajtott felhasználói tranzakciókat, mivel ezek teljesítménye minden más tranzakcióra hatással van.
  2. Legalább egy nem szerkesztési tranzakciót használjon az olvasási teljesítmény és az írási teljesítmény megkülönböztetéséhez.
  3. Tartalmazza azokat a tranzakciókat, amelyek az alapvető üzleti célt szolgálják – az itt bekövetkező kudarcoknak van a legnagyobb hatásuk.
  4. Legalább egy szerkesztési tranzakciót kell tartalmaznia az írási teljesítmény és az olvasási teljesítmény megkülönböztetése érdekében.
  5. A válaszidő mérése a maximálisan előre jelzett virtuális felhasználói terhelés mellett.
  6. Rekordlekérés késleltetésének mérése nagy léptékben.

A gyakori terheléstesztelő eszközök közé tartoznak a következők: LoadRunner Professional, WinRunner és Apache JMeter.

Mi az adatbázis stressztesztelés?

Adatbázis stressztesztelés nagy terhelést jelent az adatbázisnak, amíg az meghibásodik. Ez azonosítja a rendszer meghibásodási pontját. A stressztesztelés gondos tervezést igényel, hogy elkerüljük az erőforrások kimerülését a megosztott infrastruktúrán. A stressztesztelésnek is nevezik kínzási tesztek or fáradtságvizsgálatLásd a tágabb értelemben vett stressztesztelési útmutató háttérként. Gyakori eszközök közé tartozik LoadRunner Professional és a JMeter.

Legjobb adatbázis-tesztelő eszközök (2026)

A megfelelő eszköz attól függ, hogy az adatbázis-verem melyik rétegét teszteli. Az alábbi táblázat a gyakori kategóriákat a legismertebb lehetőségekkel párosítja.

KategóriaSzerszámLegmegfelelőbb
Egység teszteléseDBUnit, tSQLtIsmételhető séma- és tárolt eljárás tesztek integrálva az Ant vagy build folyamatokba.
Terhelés és feszültségLoadRunner Professional, Apache JMeterNagy volumenű virtuális felhasználói szimuláció éles szintű munkaterhelésekkel szemben.
Adatok összehasonlításaRedgate SQL adatösszehasonlító, Apache DBUtilsAnnak ellenőrzése, hogy két adatbázis azonos adatokat tartalmaz-e migráció vagy ETL után.
Mintaadatok generálásaMockaroo, DatatectValósághű tesztadatkészletek létrehozása, amelyek tiszteletben tartják a referenciális integritást.
SémakezelésLiquibase, FlywayVerzióvezérelt migrációk és visszagörgetési tesztelés különböző környezetekben.
SQL szerkesztő / eseti validációDBeaver, Azure Adatstúdió, SSMSInteraktív lekérdezés-készítés feltáró adatbázis-tesztelés során.

Párosítson legalább egy eszközt a terhelési kategóriából egy eszközzel az egységkategóriából, hogy lefedje mind a teljesítmény-, mind a regressziós kockázatot.

A leggyakoribb problémák az adatbázis tesztelése során

KiadásAjánlott megoldás
Jelentős többletterhelés szükséges az adatbázis-tranzakciók állapotának meghatározásához.Tervezd meg előre az időzítést és a függőségeket, hogy a végrehajtás során ne merüljön fel kétértelműség a tranzakció állapotával kapcsolatban.
Az új tesztadatokat a régi tesztadatok megtisztítása után kell megtervezni.Dokumentált tesztadat-generálási stratégiát és frissítési eljárást kell fenntartani minden ciklus előtt.
Egy SQL generátorra van szükség az SQL validátorok átalakításához, hogy a lekérdezések megfeleljenek a szükséges teszteseteknek.Az SQL-karbantartást a teljes folyamat első osztályú részének kell tekinteni. tesztelési stratégia, nem eseti munkaként.
A fenti előfeltételek költségessé és időigényessé tehetik a beállítást.A tesztek mélységének és az ütemtervnek az egyensúlyban tartása a lefedettség szintjeinek meghatározásával: mélyreható automatizálás a magas kockázatú területeken, könnyű ellenőrzések máshol.

Mítoszok és tévhitek az adatbázis-tesztelésről

Az adatbázis-tesztelés mítoszai kontra valóság

MítoszValóság
Az adatbázis-tesztelés mélyreható szakértelmet igényel, és túl fárasztó ahhoz, hogy indokolt legyen.A hatékony adatbázis-tesztelés hosszú távú funkcionális stabilitást biztosít. A ráfordítás sokszorosan megtérül a csökkentett incidensválaszidában.
Az adatbázis-tesztelés további szűk keresztmetszetet teremt.Korán felszínre hozza a rejtett hibákat, és javítja az alkalmazás általános minőségét, a szűk keresztmetszeteket ahelyett, hogy létrehozná azokat.
Az adatbázis-tesztelés lelassítja a fejlesztési folyamatot.Az adatbázis-tesztelésbe való befektetés felgyorsítja a későbbi fejlesztést azáltal, hogy a séma- és integritási hibákat még azelőtt észleli, hogy azok kaszkádosodnának.
Az adatbázis-tesztelés rendkívül költséges.Adatbázis (és SQL) a tesztelés hosszú távú befektetés az alkalmazás stabilitásába, és fedezetet nyújt a költséges termelési hibákkal szemben.

Best Practices

  • Minden adat – metaadatok és funkcionális adatok – validálása a követelményspecifikáció alapján, beleértve a hozzá tartozó térképet is.ping szabályokat.
  • Revnézd meg minden készletet teszt adat a fejlesztőcsapat által vagy velük közösen készítették, mielőtt arra támaszkodnának.
  • A kimeneti adatokat manuális és automatizált eljárásokkal is validálja.
  • Ok-okozati ábrázolás, ekvivalencia particionálás és határérték-analízis alkalmazása tesztadat-feltételek generálásakor.
  • Ellenőrizd a hivatkozási integritási szabályokat a szükséges adatbázistáblákban.
  • Az adatbázis konzisztenciájának ellenőrzésekor szándékosan alapértelmezett értékeket használjon, és győződjön meg arról, hogy a naplóesemények minden szükséges bejelentkezési eseményhez rögzítésre kerülnek.
  • Győződjön meg arról, hogy az ütemezett feladatok időben végrehajtódnak, és a várt eredményeket hozzák létre.
  • Készítsen biztonsági másolatot az adatbázisról egy meghatározott ütemterv szerint, és legalább negyedévente ellenőrizze a visszaállítási útvonalat.

Lásd még — Adatbázistesztelés Interjú kérdések és válaszok.

GYIK

Az adatbázis-tesztelés egy élő, működő adatbázist validál – sémát, tranzakciókat, integritást. ETL tesztelés validálja az adatmozgást a forrás- és célrendszerek között, ellenőrizve az átalakítások helyességét, teljességét és a darabszámot egy adattárház-folyamatban.

Igen. A modern mesterséges intelligencia asszisztensek DDL-t és mintaadatokat olvasva javasolnak egységteszteket a tárolt eljárásokhoz, határteszteket az oszlopokhoz és hivatkozási integritási ellenőrzéseket. Az üzleti szabályok betartatásához és a kockázattal súlyozott lefedettség prioritásának meghatározásához továbbra is szükség van emberi felülvizsgálatra.

Csak maszkolás vagy anonimizálás után. A nyers éles adatok adatvédelmi és szabályozási kockázatoknak teszik ki a csapatot a GDPR, a HIPAA vagy a PCI-DSS értelmében. Használjon determinisztikus maszkolást, hogy a hivatkozási integritás megmaradjon a táblázatok között.

Ugyanezek a kategóriák érvényesek a módosított ellenőrzésekre is: a sémavalidáció a dokumentum vagy oszlopcsalád alakjára összpontosít, az integritástesztelés a végső konzisztenciát vizsgálja, a stressztesztelés pedig a szegmenskiegyensúlyozást hangsúlyozza. MongoDB, Cassandraés DynamoDB mindenki számára alkalmasak ezek az átalakított lakosztályok.

Nem. A mesterséges intelligencia felgyorsítja a lekérdezések szerkesztését, a tesztek generálását és az anomáliadetektálást, de az emberi tesztelők feladata továbbra is a kockázatprioritás, a szabályozási értelmezés és a feltáró tesztelés – az a nagy megítélést igénylő munka, amelyet a szakterületi szakértelem vezérel, és amelyet a mesterséges intelligencia inkább kiegészít, mint helyettesít.

Foglald össze ezt a bejegyzést a következőképpen: