Chancejs y Fakerjs: Generando datos falsos para tus tests

fakerjsA la hora de crear pruebas automáticas será muy habitual que llegue un momento en el que necesites generar datos aleatorios, pero que parezcan reales, para poder utilizarlos en esas pruebas. En formularios será necesario rellenar campos como email, código postal, nombre de usuario, etc. y los formularios van a validar el formato de esos datos, por lo que no sirve rellenar con una cadena de texto aleatoria todos los campos.

En este punto podemos tomar 2 caminos, generar nosotros mismos esos valores, o utilizar alguna librería externa que nos facilite este trabajo. Incluso, y esta creo que es la mejor opción, combinar las 2 posibilidades.Cuando necesitemos un dato aleatorio que deba cumplir con unos requisitos propios, nos lo creamos nosotros. Cuando queremos generar valores aleatorios más generales, pues usamos alguna herramienta externa, como Chance.js o Faker.js.

Chance.js

Es un generador de cadenas de texto, números y un montón más de tipos de datos aleatorios, que puede ser de gran utilidad en nuestros tests automáticos. Por ejemplo los creados con Nightwatch.js.

El proyecto está escrito por Victor Quinn, aunque cuenta con más de 100 colaboraciones.

Lo que más me ha gustado de este proyecto en concreto es su documentación, que permite empezar a usarlo de forma muy rápida, y además saber cuales son las posibilidades que tenemos a nuestro alcance. Lo que menos, que aunque nos hemos decidido a colaborar con alguna aportación, no parece que estos cambios se revisen demasiado rápido.

Quizás su mayor limitación es una escasa internacionalización, que hace que en algunos casos los datos generados no sean válidos para nosotros. Por ejemplo, a la hora generar teléfonos, estamos limitados a números de teléfono con formato válido para Estados Unidos, Reino Unido o Francia, según su documentación. Si miramos el código vemos que hay algo más de internacionalización de la que aparece en la docu.

La lista de opciones es la siguiente:

  • Basics
    • bool
    • character
    • floating
    • integer
    • letter
    • natural
    • prime
    • string
  • Text
    • paragraph
    • sentence
    • syllable
    • word
  • Person
    • age
    • birthday
    • cf
    • cpf
    • first
    • gender
    • last
    • name
    • prefix
    • ssn
    • suffix
  • Thing
    • animal
  • Mobile
    • android_id
    • apple_token
    • bb_pin
    • wp7_anid
    • wp8_anid2
  • Web
    • avatar
    • color
    • company
    • domain
    • email
    • fbid
    • google_analytics
    • hashtag
    • ip
    • ipv6
    • klout
    • profession
    • tld
    • twitter
    • url
  • Location
    • address
    • altitude
    • areacode
    • city
    • coordinates
    • country
    • depth
    • geohash
    • latitude
    • longitude
    • phone
    • postal
    • postcode
    • province
    • state
    • street
    • zip
  • Time
    • ampm
    • date
    • hammertime
    • hour
    • millisecond
    • minute
    • month
    • second
    • timestamp
    • timezone
    • weekday
    • year
  • Finance
    • cc
    • cc_type
    • currency
    • currency_pair
    • dollar
    • euro
    • exp
    • exp_month
    • exp_year
  • Helpers
    • capitalize
    • mixin
    • pad
    • pick
    • pickone
    • pickset
    • set
    • shuffle
  • Miscellaneous
    • coin
    • dice
    • guid
    • hash
    • hidden
    • n
    • normal
    • radio
    • rpg
    • tv
    • unique
    • weighted

Faker.js

Este es otro proyecto que nos permite generar datos falsos para usarlos en nuestros tests, incluyendo la opción de generar avatares. Podéis ver ejemplos de los datos generados con Faker.js aquí. Hay muchísimas posibilidades, y a nivel de localización es mucho más interesante que Chance.js, si bien la documentación, a mi parecer, es peor.

La lista de opciones disponibles con Faker.js es bastante impresionante:

  • address
    • zipCode
    • city
    • cityPrefix
    • citySuffix
    • streetName
    • streetAddress
    • streetSuffix
    • streetPrefix
    • secondaryAddress
    • county
    • country
    • countryCode
    • state
    • stateAbbr
    • latitude
    • longitude
  • commerce
    • color
    • department
    • productName
    • price
    • productAdjective
    • productMaterial
    • product
  • company
    • suffixes
    • companyName
    • companySuffix
    • catchPhrase
    • bs
    • catchPhraseAdjective
    • catchPhraseDescriptor
    • catchPhraseNoun
    • bsAdjective
    • bsBuzz
    • bsNoun
  • database
    • column
    • type
    • collation
    • engine
  • date
    • past
    • future
    • between
    • recent
    • soon
    • month
    • weekday
  • fake
  • finance
    • account
    • accountName
    • mask
    • amount
    • transactionType
    • currencyCode
    • currencyName
    • currencySymbol
    • bitcoinAddress
    • ethereumAddress
    • iban
    • bic
  • hacker
    • abbreviation
    • adjective
    • noun
    • verb
    • ingverb
    • phrase
  • helpers
    • randomize
    • slugify
    • replaceSymbolWithNumber
    • replaceSymbols
    • shuffle
    • mustache
    • createCard
    • contextualCard
    • userCard
    • createTransaction
  • image
    • image
    • avatar
    • imageUrl
    • abstract
    • animals
    • business
    • cats
    • city
    • food
    • nightlife
    • fashion
    • people
    • nature
    • sports
    • technics
    • transport
    • dataUri
  • internet
    • avatar
    • email
    • exampleEmail
    • userName
    • protocol
    • url
    • domainName
    • domainSuffix
    • domainWord
    • ip
    • ipv6
    • userAgent
    • color
    • mac
    • password
  • lorem
    • word
    • words
    • sentence
    • slug
    • sentences
    • paragraph
    • paragraphs
    • text
    • lines
  • name
    • firstName
    • lastName
    • findName
    • jobTitle
    • prefix
    • suffix
    • title
    • jobDescriptor
    • jobArea
    • jobType
  • phone
    • phoneNumber
    • phoneNumberFormat
    • phoneFormats
  • random
    • number
    • float
    • arrayElement
    • objectElement
    • uuid
    • boolean
    • word
    • words
    • image
    • locale
    • alphaNumeric
    • hexaDecimal
  • system
    • fileName
    • commonFileName
    • mimeType
    • commonFileType
    • commonFileExt
    • fileType
    • fileExt
    • directoryPath
    • filePath
    • semver

Lo bueno es que tampoco tenemos por qué “casarnos” con uno u otro. Podemos utilizar los 2 y generar los datos con el que más se adecue a lo que necesitamos en cada momento.

En este otro artículo os dejo un ejemplo de uso de Chance.js y Faker.js con Nightwatch.js.