اعتبارًا من 15 نوفمبر 2020، أصبح Easy Random في وضع الصيانة. وهذا يعني أنه سيتم معالجة إصلاحات الأخطاء فقط من الآن فصاعدًا (باستثناء دعم السجلات الذي سيتم إصداره عند انتهاء إصدار Java 16). الإصدار 5.0.x (المستند إلى Java 11) والإصدار 4.3.x (المستند إلى Java 8) هما الإصداران الوحيدان المدعومان في الوقت الحالي. يرجى النظر في الترقية إلى أحد هذه الإصدارات في أقرب وقت ممكن.
Easy Random هي مكتبة تقوم بإنشاء كائنات Java عشوائية. يمكنك اعتباره ObjectMother لـ JVM. لنفترض أن لديك فئة Person
وتريد إنشاء مثيل عشوائي لها، ها نحن ذا:
EasyRandom easyRandom = new EasyRandom ();
Person person = easyRandom . nextObject ( Person . class );
الطريقة EasyRandom#nextObject
قادرة على إنشاء مثيلات عشوائية من أي نوع معين.
توفر واجهة برمجة التطبيقات java.util.Random
7 طرق لإنشاء بيانات عشوائية: nextInt()
و nextLong()
و nextDouble()
و nextFloat()
و nextBytes()
و nextBoolean()
و nextGaussian()
. ماذا لو كنت بحاجة إلى إنشاء String
عشوائية؟ أو قل مثيلًا عشوائيًا لكائن المجال الخاص بك؟ يوفر Easy Random واجهة برمجة التطبيقات EasyRandom
التي تعمل على توسيع java.util.Random
بطريقة تسمى nextObject(Class type)
. هذه الطريقة قادرة على إنشاء نسخة عشوائية من أي حبة جافا عشوائية.
تعد فئة EasyRandomParameters
نقطة الإدخال الرئيسية لتكوين مثيلات EasyRandom
. يسمح لك بتعيين جميع المعلمات للتحكم في كيفية إنشاء البيانات العشوائية:
EasyRandomParameters parameters = new EasyRandomParameters ()
. seed ( 123L )
. objectPoolSize ( 100 )
. randomizationDepth ( 3 )
. charset ( forName ( "UTF-8" ))
. timeRange ( nine , five )
. dateRange ( today , tomorrow )
. stringLengthRange ( 5 , 50 )
. collectionSizeRange ( 1 , 10 )
. scanClasspathForConcreteTypes ( true )
. overrideDefaultInitialization ( false )
. ignoreRandomizationErrors ( true );
EasyRandom easyRandom = new EasyRandom ( parameters );
لمزيد من التفاصيل حول هذه المعلمات، يرجى الرجوع إلى قسم معلمات التكوين.
في معظم الحالات، تكون الخيارات الافتراضية كافية ويمكنك استخدام المُنشئ الافتراضي لـ EasyRandom
.
يتيح لك Easy Random التحكم في كيفية إنشاء بيانات عشوائية من خلال واجهة org.jeasy.random.api.Randomizer
ويسهل استبعاد بعض الحقول من الرسم البياني للكائن باستخدام java.util.function.Predicate
:
EasyRandomParameters parameters = new EasyRandomParameters ()
. randomize ( String . class , () -> "foo" )
. excludeField ( named ( "age" ). and ( ofType ( Integer . class )). and ( inClass ( Person . class )));
EasyRandom easyRandom = new EasyRandom ( parameters );
Person person = easyRandom . nextObject ( Person . class );
في المثال السابق، سيقوم Easy Random بما يلي:
String
إلى foo
(باستخدام Randomizer
المحدد كتعبير lambda)age
من النوع Integer
في فئة Person
. يتم تعريف الأساليب الثابتة named
ofType
و inClass
في org.jeasy.random.FieldPredicates
الذي يوفر مسندات مشتركة يمكنك استخدامها معًا لتحديد الحقول التي سيتم استبعادها بالضبط. يمكن استخدام فئة مشابهة تسمى TypePredicates
لتحديد الأنواع التي سيتم استبعادها من الرسم البياني للكائن. يمكنك بالطبع استخدام java.util.function.Predicate
الخاص بك مع تلك المسندات المحددة مسبقًا.
قد يبدو ملء كائن Java ببيانات عشوائية أمرًا سهلاً للوهلة الأولى، إلا إذا كان نموذج المجال الخاص بك يتضمن العديد من الفئات ذات الصلة. في المثال السابق، لنفترض أن نوع Person
محدد على النحو التالي:
بدون Easy Random، يمكنك كتابة الكود التالي لإنشاء مثيل لفئة Person
:
Street street = new Street ( 12 , ( byte ) 1 , "Oxford street" );
Address address = new Address ( street , "123456" , "London" , "United Kingdom" );
Person person = new Person ( "Foo" , "Bar" , "[email protected]" , Gender . MALE , address );
وإذا كانت هذه الفئات لا توفر للمنشئات معلمات (قد تكون بعض الأنواع القديمة لا يمكنك تغييرها)، فستكتب:
Street street = new Street ();
street . setNumber ( 12 );
street . setType (( byte ) 1 );
street . setName ( "Oxford street" );
Address address = new Address ();
address . setStreet ( street );
address . setZipCode ( "123456" );
address . setCity ( "London" );
address . setCountry ( "United Kingdom" );
Person person = new Person ();
person . setFirstName ( "Foo" );
person . setLastName ( "Bar" );
person . setEmail ( "[email protected]" );
person . setGender ( Gender . MALE );
person . setAddress ( address );
باستخدام Easy Random، يتم إنشاء كائن Person
عشوائي باستخدام new EasyRandom().nextObject(Person.class)
. ستقوم المكتبة بملء كل الرسم البياني للكائن بشكل متكرر . هذا فرق كبير!
في بعض الأحيان، لا تهم أداة الاختبار حقًا منطق الاختبار. على سبيل المثال، إذا أردنا اختبار نتيجة خوارزمية فرز جديدة، فيمكننا إنشاء بيانات إدخال عشوائية والتأكد من فرز المخرجات، بغض النظر عن البيانات نفسها:
@ org . junit . Test
public void testSortAlgorithm () {
// Given
int [] ints = easyRandom . nextObject ( int []. class );
// When
int [] sortedInts = myAwesomeSortAlgo . sort ( ints );
// Then
assertThat ( sortedInts ). isSorted (); // fake assertion
}
مثال آخر هو اختبار استمرارية كائن المجال، يمكننا إنشاء كائن مجال عشوائي، والاستمرار فيه والتأكد من أن قاعدة البيانات تحتوي على نفس القيم:
@ org . junit . Test
public void testPersistPerson () throws Exception {
// Given
Person person = easyRandom . nextObject ( Person . class );
// When
personDao . persist ( person );
// Then
assertThat ( "person_table" ). column ( "name" ). value (). isEqualTo ( person . getName ()); // assretj db
}
هناك العديد من حالات الاستخدامات الأخرى التي يمكن أن يكون فيها Easy Random مفيدًا، ويمكنك العثور على قائمة غير شاملة في wiki.
مرحبًا بك للمساهمة في المشروع بطلبات السحب على GitHub. يرجى ملاحظة أن Easy Random في وضع الصيانة، مما يعني أنه سيتم النظر فقط في طلبات السحب لإصلاح الأخطاء.
إذا كنت تعتقد أنك عثرت على خطأ أو كان لديك أي سؤال، فيرجى استخدام أداة تعقب المشكلات.
شكرا لكم جميعا على مساهماتكم!
رخصة معهد ماساتشوستس للتكنولوجيا. راجع LICENSE.txt.