不一样的虚假(Bogus)和骗子(Faker)
首先声明,Bogus是一个Nuget包的名称,Faker是它内部的一个类,这个库的作用就是模拟生成实体类的数据,特别适合测试时的场景,不用苦思冥想,辛辛苦苦来造不同的实体类了。当然,造出来的都是虚假的(Bogus),骗人的(Faker)。它家在这里:https://github.com/bchavez/Bogus
假如我有个会员类
enum Sex
{
男,
女
}
class Memmber
{
public Guid ID { get; set; }
public long NO { get; set; }
public string Name { get; set; }
public Sex Sex { get; set; }
public int Age { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
public decimal Balance { get; set; }
public DateTime CreateOn { get; set; }
}
这个类在测试时,要手动实例化,穿梭于各个层和方法中间,现在把构建这个类的对象(实例),交给Bogus。
首先引入Bogus包
Install-Package Bogus
接下来就可以告诉Faker怎么来“骗人”了
var options = new JsonSerializerOptions();
options.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(UnicodeRanges.All);
while (true)
{
var personFaker = new Faker()
.RuleFor(x => x.ID, x => x.Random.Guid())
.RuleFor(x=>x.NO,x=>x.Random.Long(100000000000,999999999999))
.RuleFor(x => x.Name, x => x.Person.LastName + x.Person.FirstName)
.RuleFor(x => x.Sex, x => x.Random.Enum())
.RuleFor(x => x.Email, x => x.Person.Email)
.RuleFor(x => x.Phone, x => x.Person.Phone)
.RuleFor(x => x.Age, x => x.Random.Int(0, 120))
.RuleFor(x=>x.Balance,x=>x.Finance.Amount(0,1000))
.RuleFor(x => x.CreateOn, x => x.Date.Past(1));
Console.WriteLine(JsonSerializer.Serialize(personFaker.Generate(), options));
Console.ReadLine();
}
看一下效果:
{
"ID":"5f3d97f6-52da-7fb6-e73f-153fd3a41bfb",
"NO":539140308276,
"Name":"KoeppErick",
"Sex":0,
"Age":48,
"Email":"Erick.Koepp@hotmail.com",
"Phone":"(899) 392-6546",
"Balance":45.34,
"CreateOn":"2021-02-14T13:32:19.892062+09:00"
}
看来,Faker是通过RuleFor来给每个属性来模拟那种格式的数据的,比如RuleFor(x => x.Email, x => x.Person.Email),告诉Faker,这是一个Email格式,记得骗人的时候,给人家一个email格式的数据,内容随便你,那问题来了,是不是有一大组格式呢?当然,这也是这个库的作用,都有哪些?
Bogus API Support
-
Address -
ZipCode- Get a zipcode. -
City- Get a city name. -
StreetAddress- Get a street address. -
CityPrefix- Get a city prefix. -
CitySuffix- Get a city suffix. -
StreetName- Get a street name. -
BuildingNumber- Get a building number. -
StreetSuffix- Get a street suffix. -
SecondaryAddress- Get a secondary address like 'Apt. 2' or 'Suite 321'. -
County- Get a county. -
Country- Get a country. -
FullAddress- Get a full address like Street, City, Country. -
CountryCode- Get a random ISO 3166-1 country code. -
State- Get a random state state. -
StateAbbr- Get a state abbreviation. -
Latitude- Get a Latitude. -
Longitude- Get a Longitude. -
Direction- Generates a cardinal or ordinal direction. IE: Northwest, South, SW, E. -
CardinalDirection- Generates a cardinal direction. IE: North, South, E, W. -
OrdinalDirection- Generates an ordinal direction. IE: Northwest, Southeast, SW, NE. -
Commerce -
Department- Get a random commerce department. -
Price- Get a random product price. -
Categories- Get random product categories. -
ProductName- Get a random product name. -
Color- Get a random color. -
Product- Get a random product. -
ProductAdjective- Random product adjective. -
ProductMaterial- Random product material. -
Ean8- Get a random EAN-8 barcode number. -
Ean13- Get a random EAN-13 barcode number. -
Company -
CompanySuffix- Get a company suffix. "Inc" and "LLC" etc. -
CompanyName- Get a company name. -
CatchPhrase- Get a company catch phrase. -
Bs- Get a company BS phrase. -
Database -
Column- Generates a column name. -
Type- Generates a column type. -
Collation- Generates a collation. -
Engine- Generates a storage engine. -
Date -
Past- Get aDateTimein the past betweenrefDateandyearsToGoBack. -
PastOffset- Get aDateTimeOffsetin the past betweenrefDateandyearsToGoBack. -
Soon- Get aDateTimethat will happen soon. -
SoonOffset- Get aDateTimeOffsetthat will happen soon. -
Future- Get aDateTimein the future betweenrefDateandyearsToGoForward. -
FutureOffset- Get aDateTimeOffsetin the future betweenrefDateandyearsToGoForward. -
Between- Get a randomDateTimebetweenstartandend. -
BetweenOffset- Get a randomDateTimeOffsetbetweenstartandend. -
Recent- Get a randomDateTimewithin the last few days. -
RecentOffset- Get a randomDateTimeOffsetwithin the last few days. -
Timespan- Get a randomTimeSpan. -
Month- Get a random month -
Weekday- Get a random weekday -
Finance -
Account- Get an account number. Default length is 8 digits. -
AccountName- Get an account name. Like "savings", "checking", "Home Loan" etc.. -
Amount- Get a random amount. Default 0 - 1000. -
TransactionType- Get a transaction type: "deposit", "withdrawal", "payment", or "invoice". -
Currency- Get a random currency. -
CreditCardNumber- Generate a random credit card number with valid Luhn checksum. -
CreditCardCvv- Generate a credit card CVV -
BitcoinAddress- Generates a random Bitcoin address. -
EthereumAddress- Generate a random Ethereum address. -
RoutingNumber- Generates an ABA routing number with valid check digit. -
Bic- Generates Bank Identifier Code (BIC) code. -
Iban- Generates an International Bank Account Number (IBAN). -
Hacker -
Abbreviation- Returns an abbreviation. -
Adjective- Returns a adjective. -
Noun- Returns a noun. -
Verb- Returns a verb. -
IngVerb- Returns a verb ending with -ing. -
Phrase- Returns a phrase. -
Images -
Abstract- Gets an abstract looking image. -
Animals- Gets an image of an animal. -
Business- Gets a business looking image. -
Cats- Gets a picture of a cat. -
City- Gets a city looking image. -
Food- Gets an image of food. -
Nightlife- Gets an image with city looking nightlife. -
Fashion- Gets an image in the fashion category. -
People- Gets an image of humans. -
Nature- Gets an image of nature. -
Sports- Gets an image related to sports. -
Technics- Get a technology related image. -
Transport- Get a transportation related image. -
DataUri- Get a SVG data URI image with a specific width and height. -
PicsumUrl- Get an image from the https://picsum.photos service. -
PlaceholderUrl- Get an image from https://placeholder.com service. -
LoremFlickrUrl- Get an image from https://loremflickr.com service. -
LoremPixelUrl- Creates an image URL with http://lorempixel.com. Note: This service is slow. Consider using PicsumUrl() as a faster alternative. -
Internet -
Avatar- Generates a legit Internet URL avatar from twitter accounts. -
Email- Generates an email address. -
ExampleEmail- Generates an example email with @example.com. -
UserName- Generates user names. -
UserNameUnicode- Generates a user name preserving Unicode characters. -
DomainName- Generates a random domain name. -
DomainWord- Generates a domain word used for domain names. -
DomainSuffix- Generates a domain name suffix like .com, .net, .org -
Ip- Gets a random IPv4 address string. -
Port- Generates a random port number. -
IpAddress- Gets a random IPv4 IPAddress type. -
IpEndPoint- Gets a random IPv4 IPEndPoint. -
Ipv6- Generates a random IPv6 address string. -
Ipv6Address- Generate a random IPv6 IPAddress type. -
Ipv6EndPoint- Gets a random IPv6 IPEndPoint. -
UserAgent- Generates a random user agent. -
Mac- Gets a random mac address. -
Password- Generates a random password. -
Color- Gets a random aesthetically pleasing color near the base RGB. See here. -
Protocol- Returns a random protocol. HTTP or HTTPS. -
Url- Generates a random URL. -
UrlWithPath- Get an absolute URL with random path. -
UrlRootedPath- Get a rooted URL path like: /foo/bar. Optionally with file extension. -
Lorem -
Word- Get a random lorem word. -
Words- Get an array of random lorem words. -
Letter- Get a character letter. -
Sentence- Get a random sentence of specific number of words. -
Sentences- Get some sentences. -
Paragraph- Get a paragraph. -
Paragraphs- Get a specified number of paragraphs. -
Text- Get random text on a random lorem methods. -
Lines- Get lines of lorem. -
Slug- Slugify lorem words. -
Name -
FirstName- Get a first name. Getting a gender specific name is only supported on locales that support it. -
LastName- Get a last name. Getting a gender specific name is only supported on locales that support it. -
FullName- Get a full name, concatenation of calling FirstName and LastName. -
Prefix- Gets a random prefix for a name. -
Suffix- Gets a random suffix for a name. -
FindName- Gets a full name. -
JobTitle- Gets a random job title. -
JobDescriptor- Get a job description. -
JobArea- Get a job area expertise. -
JobType- Get a type of job. -
Phone -
PhoneNumber- Get a phone number. -
PhoneNumberFormat- Gets a phone number based on the locale's phone_number.formats[] array index. -
Rant -
Review- Generates a random user review. -
Reviews- Generate an array of random reviews. -
System -
FileName- Get a random file name. -
DirectoryPath- Get a random directory path (Unix). -
FilePath- Get a random file path (Unix). -
CommonFileName- Generates a random file name with a common file extension. -
MimeType- Get a random mime type -
CommonFileType- Returns a commonly used file type. -
CommonFileExt- Returns a commonly used file extension. -
FileType- Returns any file type available as mime-type. -
FileExt- Gets a random extension for the given mime type. -
Semver- Get a random semver version string. -
Version- Get a randomVersion. -
Exception- Get a randomExceptionwith a fake stack trace. -
AndroidId- Get a random GCM registration ID. -
ApplePushToken- Get a random Apple Push Token -
BlackBerryPin- Get a random BlackBerry Device PIN -
Vehicle -
Vin- Generate a vehicle identification number (VIN). -
Manufacturer- Get a vehicle manufacture name. IE: Toyota, Ford, Porsche. -
Model- Get a vehicle model. IE: Camry, Civic, Accord. -
Type- Get a vehicle type. IE: Minivan, SUV, Sedan. -
Fuel- Get a vehicle fuel type. IE: Electric, Gasoline, Diesel. -
Random/Randomizer -
Number- Get an int from 0 to max. -
Digits- Get a random sequence of digits. -
Even- Returns a random even number. -
Odd- Returns a random odd number. -
Double- Get a random double, between 0.0 and 1.0. -
Decimal- Get a random decimal, between 0.0 and 1.0. -
Float- Get a random float, between 0.0 and 1.0. -
Byte- Generate a random byte between 0 and 255. -
Bytes- Get a random sequence of bytes. -
SByte- Generate a random sbyte between -128 and 127. -
Int- Generate a random int between MinValue and MaxValue. -
UInt- Generate a random uint between MinValue and MaxValue. -
ULong- Generate a random ulong between -128 and 127. -
Long- Generate a random long between MinValue and MaxValue. -
Short- Generate a random short between MinValue and MaxValue. -
UShort- Generate a random ushort between MinValue and MaxValue. -
Char- Generate a random char between MinValue and MaxValue. -
Chars- Generate a random chars between MinValue and MaxValue. -
String- Get a string of characters of a specific length. -
String2- Get a string of characters with a specific length drawing characters fromchars. -
Hash- Return a random hex hash. Default 40 characters, aka SHA-1. -
Bool- Get a random boolean. -
ArrayElement- Get a random array element. -
ArrayElement- Get a random array element. -
ArrayElements- Get a random subset of an array. -
ListItem- Get a random list item. -
ListItems- Get a random subset of a List. -
CollectionItem- Get a random collection item. -
ReplaceNumbers- Replaces symbols with numbers. -
ReplaceSymbols- Replaces each character instance in a string. -
Replace- Replaces symbols with numbers and letters. # = number, ? = letter, * = number or letter. -
ClampString- Clamps the length of a string between min and max characters. -
Enum- Picks a random Enum of T. Works only with Enums. -
Shuffle- Shuffles an IEnumerable source. -
Word- Returns a single word or phrase in English. -
Words- Gets some random words and phrases in English. -
WordsArray- Get a range of words in an array (English). -
Guid- Get a random GUID. -
Uuid- Get a random GUID. Alias for Randomizer.Guid(). -
RandomLocale- Returns a random locale. -
AlphaNumeric- Returns a random set of alpha numeric characters 0-9, a-z. -
Hexadecimal- Generates a random hexadecimal string. -
WeightedRandom- Returns a selection of T[] based on a weighted distribution of probability.
是不是挺丰富的,一般场景应该够用了,如果有特殊数据模拟,也只能自已动手了。
对,我是一个祖国的程序员,Member类生成的实例是外国的,这不行,换一下:
var options = new JsonSerializerOptions();
options.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(UnicodeRanges.All);
while (true)
{
var personFaker = new Faker("zh_CN")
.RuleFor(x => x.ID, x => x.Random.Guid())
.RuleFor(x=>x.NO,x=>x.Random.Long(100000000000,999999999999))
.RuleFor(x => x.Name, x => x.Person.LastName + x.Person.FirstName)
.RuleFor(x => x.Sex, x => x.Random.Enum())
.RuleFor(x => x.Email, x => x.Person.Email)
.RuleFor(x => x.Phone, x => x.Person.Phone)
.RuleFor(x => x.Age, x => x.Random.Int(0, 120))
.RuleFor(x=>x.Balance,x=>x.Finance.Amount(0,1000))
.RuleFor(x => x.CreateOn, x => x.Date.Past(1));
Console.WriteLine(JsonSerializer.Serialize(personFaker.Generate(), options));
Console.ReadLine();
}
只需要在new Faker
{
"ID":"219d56ca-ea21-3a02-84b5-d9950ae8f384",
"NO":362783628351,
"Name":"徐思远",
"Sex":0,
"Age":100,
"Email":"40@gmail.com",
"Phone":"024-65735687",
"Balance":623.22,
"CreateOn":"2021-01-19T19:38:30.1504231+09:00"
}
其中的名字还真像个真人名,电话号也换成祖国的了。
那还支持其他国家吗?当然
|
Locale Code |
Language |
Locale Code |
Language |
|
|
af_ZA |
Afrikaans |
fr_CH |
French (Switzerland) |
|
|
ar |
Arabic |
ge |
Georgian |
|
|
az |
Azerbaijani |
hr |
Hrvatski |
|
|
cz |
Czech |
id_ID |
Indonesia |
|
|
de |
German |
it |
Italian |
|
|
de_AT |
German (Austria) |
ja |
Japanese |
|
|
de_CH |
German (Switzerland) |
ko |
Korean |
|
|
el |
Greek |
lv |
Latvian |
|
|
en |
English |
nb_NO |
Norwegian |
|
|
en_AU |
English (Australia) |
ne |
Nepalese |
|
|
en_AU_ocker |
English (Australia Ocker) |
nl |
Dutch |
|
|
en_BORK |
English (Bork) |
nl_BE |
Dutch (Belgium) |
|
|
en_CA |
English (Canada) |
pl |
Polish |
|
|
en_GB |
English (Great Britain) |
pt_BR |
Portuguese (Brazil) |
|
|
en_IE |
English (Ireland) |
pt_PT |
Portuguese (Portugal) |
|
|
en_IND |
English (India) |
ro |
Romanian |
|
|
en_NG |
Nigeria (English) |
ru |
Russian |
|
|
en_US |
English (United States) |
sk |
Slovakian |
|
|
en_ZA |
English (South Africa) |
sv |
Swedish |
|
|
es |
Spanish |
tr |
Turkish |
|
|
es_MX |
Spanish (Mexico) |
uk |
Ukrainian |
|
|
fa |
Farsi |
vi |
Vietnamese |
|
|
fi |
Finnish |
zh_CN |
Chinese |
|
|
fr |
French |
zh_TW |
Chinese (Taiwan) |
|
|
fr_CA |
French (Canada) |
zu_ZA |
Zulu (South Africa) |
其实还有Bogus有很多其他功能,大家可以自行探索。
想要更快更方便的了解相关知识,可以关注微信公众号