Menu

Cv-datagenerator: synthetische loopbaanrecords voor ATS-tests

Een cv-datagenerator produceert loopbaanrecords met samenhangende tijdlijnen, plausibele functietitels en volledige opleidingsgegevens, zodat je ATS, parser of sollicitatieformulier goed kan worden getest.

Gepubliceerd

  • testdata
  • werving
  • automatisering

Een cv-datagenerator bouwt een heel loopbaanverhaal — een persoon, een reeks rollen met begin- en einddata, een opleidingsgeschiedenis, een vaardighedenlijst, een set certificeringen en een salarisverwachting — zodanig samengesteld dat de onderdelen samen kloppen. Een parser één veld tegelijk voeren test bijna niets; een parser een consistente chronologie voeren is wat de fouten aan het licht brengt die teams werkelijk uitleveren.

Deze gids behandelt wat een wervingssysteem van een kandidaatrecord verwacht, welke tijdlijnregels een generator moet respecteren, waarom functietitels en vaardigheden uit een landbewuste taxonomie moeten komen, en waar de privacysgrens ligt wanneer het record op een persoon lijkt. Aan het einde zou je moeten weten welke beweringen in een sollicitatieformuliertest thuishoren en welke eigenschappen van een cv moeilijker zijn dan ze lijken.

Wat doet een wervingssysteem met een kandidaatrecord?

Een applicant tracking system ontvangt een document, parseert het naar gestructureerde velden, ontdoet het van duplicaten ten opzichte van bestaande kandidaten, scoort het, routeert het naar een beoordelaar en bewaart het gedurende een bewaartermijn. Elk van die stappen kan alleen worden getest als de invoer op een echte loopbaan lijkt in plaats van op een lijst met trefwoorden.

Parseren is de stap waarin gegenereerde data haar plaats verdient. Een parser moet de werkgever, de titel, de data en de locatie in vrije tekst vinden, en de faalwijzen zijn specifiek: een titel die als werkgever wordt gelezen, een maand en een jaar die als bereik worden gelezen, een locatie die in de functietitel wordt opgenomen, een document van twee pagina’s dat verkeerd wordt samengevoegd. Die fouten verschijnen alleen wanneer de invoer de vorm van een echt document heeft. De fouten clusteren ook rond bestandsverwerking in plaats van tekst: een document met een tabel in plaats van een lijst, een kop die op elke pagina terugkomt, een naam met een accent die in de verkeerde codering aankomt, of een tweekolomsindeling die van links naar rechts over beide kolommen wordt gelezen. Gegenereerde records maken die varianten goedkoop om te produceren en goedkoop om als fixtures te bewaren.

Matchen is de tweede stap, en die hangt af van velden die overeenstemmen. Een kandidaat van wie de meest recente rol in het ene land is en van wie het adres in een ander land is, is in de praktijk niet ongewoon, maar een kandidaat van wie de opleidingsdata na de werkdata komen, is dat wel. Een generator die de chronologie respecteert, geeft je records die de matchlogica eerlijk beoefenen. Deduplicatie is een verwante test, want die hangt af van bijna-overeenkomsten in plaats van exacte: dezelfde persoon twee keer met een naam met koppelteken, een meisjesnaam, een ander e-mailadres, of een bedrijfsnaam die anders wordt afgekort. Die varianten opzettelijk produceren is de enige betrouwbare manier om erachter te komen of de samenvoegstap het juiste record behoudt. Het artikel over testdata voor loopbaanprofielen behandelt de bredere veldenset, en het artikel over testfixtures voor cv-parsing laat zien hoe je gegenereerde records omzet in documenten waarop een parser kan worden uitgevoerd.

Welke tijdlijnregels moeten gelden

De eerste regel is dat een rol eindigt nadat ze begint. Dit klinkt triviaal en wordt voortdurend geschonden door handmatig gebouwde fixtures, omdat de twee data op afzonderlijke plekken worden ingevoerd en niets de relatie ertussen afdwingt. Elk record waarin het einde het begin voorafgaat, zal een chronologievalidator niet doorstaan, en als de testsuite geen dergelijke validator heeft, wordt het opgeslagen en breekt het later een rapport.

De tweede regel betreft gaten en overlappingen. Een loopbaan kan een gat tussen rollen bevatten, en gaten zijn legitiem en gebruikelijk. Overlappingen zijn ook mogelijk wanneer iemand twee gelijktijdige posities bekleedde, maar ze zijn zeldzaam genoeg dat een generator ze als een bewust geval zou moeten behandelen in plaats van als een standaard. Wat ertoe doet is dat de keuze expliciet is: een dataset die nooit gaten produceert, zal nooit het pad voor gatverwerking testen, en een die nooit overlappingen produceert, zal nooit de overlapwaarschuwing testen.

De derde regel is dat opleiding voorafgaat aan of gelijkloopt met vroege werkzaamheden. Een kandidaat kan werken terwijl hij studeert, dus de twee kunnen overlappen, maar een graad die is behaald voordat de persoon oud genoeg was om te werken, is een fout. Hier moeten een gegenereerde geboortedatum en een gegenereerde opleidingstijdlijn van elkaar worden afgeleid in plaats van onafhankelijk getrokken.

De vierde regel gaat over het heden. Precies één rol kan actueel zijn, en die hoort geen einddatum te hebben. Een dataset waarin verscheidene rollen als actueel zijn gemarkeerd, of waarin de meest recente rol jaren geleden eindigde terwijl de kandidaat als actief zoekend wordt beschreven, produceert inconsistente signalen die een echte screeningspijplijn zou markeren.

Waarom hebben functietitels en branches een taxonomie nodig?

Een functietitel is geen vrije tekst met een duidelijke betekenis. Hetzelfde werk heet iets anders bij verschillende bedrijven, in verschillende branches en in verschillende landen, en het niveau dat een titel impliceert, varieert met alle drie. Een generator die een willekeurig senioriteitswoord aan een willekeurig zelfstandig naamwoord plakt, produceert titels die geen enkel systeem correct groepeert.

De nuttige aanpak is een taxonomie waarin elke titel bij een functie en een niveau hoort, en elke functie bij een set branches waarin ze plausibel voorkomt. Een titel uit de verkeerde branche is een record dat een matchalgoritme onzinnig zal scoren, en een niveau dat de jaren ervaring in het record tegenspreekt, is een record dat een beoordelaar onmiddellijk zou wantrouwen. Het artikel over functietitels per branche legt uit hoe de groeperingen worden opgebouwd.

Vaardigheden volgen dezelfde logica. Een vaardighedenlijst hoort plausibel te zijn voor de rol, en een senior rol hoort een andere mix te dragen dan een junior. Vaardigheidsniveaus worden meestal op een schaal uitgedrukt, en een record dat voor elke vaardigheid het hoogste niveau claimt, is even oninformatief als een dat niets claimt. Het artikel over vaardighedentaxonomie en niveaus behandelt hoe de schalen worden gedefinieerd en waarom het aantal stappen ertoe doet.

Certificeringen en licenties voegen een derde dimensie toe, want sommige rollen vereisen ze en sommige niet, en een licentie is meestal aan een jurisdictie gebonden. Een record dat een licentie claimt die door het ene land is uitgegeven terwijl de werkgeschiedenis in een ander land ligt, is een samenhangfout die het waard is om opzettelijk als negatief testgeval te genereren. Het artikel over licentie- en certificeringsdata beschrijft de patronen.

Hoe moeten salaris en valuta worden behandeld?

Salaris is het veld dat het vaakst wordt opgeslagen in een vorm die later geen vragen kan beantwoorden. Een getal zonder valuta en periode is geen salaris; het is een getal. Dertigduizend betekent verschillende dingen als jaarbedrag in de ene valuta en als maandbedrag in een andere, en een dataset die beide velden weglaat, produceert rapporten die niemand kan verzoenen.

Het nuttige model slaat een bedrag, een valutacode en een periode zoals jaarlijks of maandelijks op, en behandelt alle drie samen als verplicht. Waar de valuta afwijkt van het land van de rol, hoort het record dat bewust te vermelden in plaats van per ongeluk, want grensoverschrijdende beloning is een echt geval dat een testsuite zou moeten opnemen. Het artikel over salarisvaluta en periode werkt de combinaties door.

Valutaopmaak introduceert een tweede klasse van fouten. Duizendtalscheiders, decimaalscheiders, de plaatsing van het valutasymbool en negatieve bedragen zijn allemaal afhankelijk van de landinstelling, en een parser die één conventie aanneemt, zal waarden uit een andere verkeerd lezen. Gegenereerde records geven je een goedkope manier om verscheidene conventies door hetzelfde codepad te voeren, inclusief de inversie die een decimale komma in een duizendtalscheider verandert. De valutacode naast het bedrag houden, in plaats van die uit het land af te leiden, is wat die beweringen stabiel maakt wanneer hetzelfde record onder een andere landinstelling wordt gelezen.

Bereiken zijn apart het testen waard. Veel formulieren accepteren een minimum en een maximum, en de relatie ertussen is hetzelfde soort beperking als de werkdata: het minimum mag het maximum niet overschrijden. Negatieve waarden en nul zijn ook het opnemen waard, want een pijplijn die ze met plezier opslaat, zal uiteindelijk een onzinnige advertentie produceren.

Bewaring verdient een eigen test. Een kandidaatrecord draagt een verwijderdatum of een beleidshorizon, en de stroom die een record anonimiseert of verwijdert wanneer die horizon passeert, is makkelijk fout te doen en wordt zelden beoefend met een gecontroleerde klok. Gegenereerde records met data die je kunt verschuiven maken die stroom testbaar zonder te wachten tot de echte tijd verstrijkt, wat de enige manier is waarop de meeste teams die ooit testen.

Wat moeten sollicitatieformuliertests toetsen?

Test de parse, niet alleen de invoer. Dien een gegenereerd document in en toets dat de geparseerde velden overeenkomen met het record dat het heeft geproduceerd, naam voor naam en datum voor datum. Deze enkele test is de meest waardevolle in de suite omdat hij het hele extractiepad dekt in plaats van alleen het formulier.

Test de chronologievalidators met opzettelijk gebroken records: een einddatum voor een begindatum, twee actuele rollen, een opleidingsvermelding die vóór de geboortedatum begint. Elk zou een specifieke afwijzing moeten produceren in plaats van een generieke fout, en de specificiteit is zelf een eigenschap die het waard is om te toetsen.

Test het pad voor bewaring en verwijdering. Een kandidaatrecord draagt een bewaartermijn, en een systeem dat records onbeperkt bewaart is een nalevingsprobleem in plaats van een functioneel probleem, wat het makkelijk maakt om het in een functionele suite over het hoofd te zien. Het artikel over bewaring van HR-data legt uit waarvoor de termijnen dienen en waarom ze per jurisdictie verschillen.

Test de velden op hun grenzen. Een vaardighedenlijst met nul vermeldingen, een loopbaangeschiedenis met één rol, een naam met een apostrof of een diakritisch teken, een werkgeversnaam op de lengtelimiet van het veld. Het artikel over testgevallen voor sollicitatieformulieren verzamelt deze in een herbruikbaar bestand, en de loopbaandatagenerator op deze site produceert records die al aan de samenhangregels voldoen, zodat de grensgevallen het enige zijn dat nog gevarieerd hoeft te worden.

Wat een synthetisch cv wel en niet is

Een gegenereerd cv beschrijft niemand. De naam is verzonnen, de werkgevers zijn verzonnen, de data zijn verzonnen, en de prestaties zijn verzonnen. Niets in het record komt overeen met de geschiedenis van een echt persoon, en geen enkele werkgever die in een gegenereerd record wordt genoemd, heeft ooit iemand in dienst gehad.

Dat is precies waarom het record veilig is om in tests te gebruiken. Omdat er geen echte kandidaat wordt beschreven, kan een fixture de data van een kandidaat niet lekken, en kan een screenshot van een stagingomgeving niemands werkgeschiedenis openbaren. Het artikel over synthetische versus geanonimiseerde data legt uit waarom verzonnen records en geïdentificeerde records verschillende dingen zijn, en waarom alleen het eerste vrij is van heridentificatierisico.

De grens doet er ook toe voor bewaring. Een synthetisch record heeft geen subject met rechten erover, maar het kan in hetzelfde systeem zitten als echte records, en een dataset die de twee mengt, is er een waarin verzoeken tot verwijdering moeilijk te vervullen worden. Houd gegenereerde records herkenbaar als gegenereerd, en houd ze buiten elke opslag die echte kandidatendata bevat.

Elk record dat op deze manier wordt geproduceerd, is synthetische testdata, alleen voor softwaretesten. Het mag niet worden ingediend als iemands sollicitatie, gebruikt om een kandidaat of een werkgever na te doen, gebruikt om werk of een credential te verkrijgen, of gebruikt om een systeem te testen dat je niet beheert.

Verder lezen

Populaire tools en praktische artikelen