بايثون عشوائي: اعمل داتا تيست احسن للاوتوميشن

قدرات توليد البيانات العشوائية في بايثون تتجاوز مجرد الأرقام العشوائية الأساسية. باستخدام مكتبات متخصصة مثل Faker، وتجهيزات pytest، وتقنيات إدارة البذور، يمكنك إنشاء بيانات اختبار واقعية تحاكي سيناريوهات العالم الحقيقي من أجل اختبارات أتمتة أكثر فعالية.
ليه بيانات الاختبار بتاعتك على الأغلب مملة (وليه دي مشكلة)
خليني أحكيلك عن المرة اللي قضيت فيها تلات أيام في تصحيح فشل “مستحيل” في اختبار أتمتة. المشكلة كانت إيه؟ بيانات الاختبار بتاعتي كانت مثالية أوي. متناسقة جداً. مملة جداً… الأرقام العشوائية بتاعتي مكانتش عشوائية بما فيه الكفاية، وملفات تعريف المستخدمين اللي عملتها كانت باينة إنها اتعملت بواسطة روبوتات (وهي فعلاً اتعملت كده)، ونطاقات التواريخ اللي استخدمتها مكانتش بتوصل أبداً للحالات الحدية الغريبة اللي دايماً بيلاقيها المستخدمين الحقيقيين.
ده كلام مألوف؟ لو لسه بتستخدم random.randint(1, 10)
كفكرتك عن “بيانات اختبار واقعية”، لازم نتكلم. الأتمتة بتاعتك تستاهل أحسن من كده. عقلك يستاهل أحسن. وبصراحة، نفسك المستقبلية اللي هتضطر تحافظ على الاختبارات دي تستاهل أحسن بكتييير.
خلينا نفصل الموضوع…
إيه اللي بيخلي بيانات الاختبار العشوائية كويسة؟
بيانات الاختبار العشوائية الجيدة مش بس غير متوقعة—دي بتمثل العالم الحقيقي مع إمكانية التحكم فيها بالكامل عند الحاجة. دي زي إنك تاكل الكيكة وتحتفظ بيها كمان.
الصفات الرئيسية للبيانات الاختبارية الفعالة
- واقعية: بتشبه أنماط بيانات الإنتاج والحالات الحدية
- قابلة للتكرار: ممكن إعادة توليدها بالظبط عند الحاجة (للتصحيح)
- شاملة: بتغطي الحالات العادية، والحالات الحدية، وسيناريوهات الأخطاء
- فعالة: بتتولد برمجياً بدل ما تتصان يدوياً
- متوافقة مع الخصوصية: مفيش بيانات مستخدمين حقيقية قد تنتهك اللوائح
الفرق بين بيانات الاختبار المتوسطة والممتازة غالباً بيمثل الفرق بين اكتشاف الأخطاء قبل الإنتاج أو تلقي رسالة نصية من المدير التنفيذي الساعة 3 الفجر عن سبب تعطل التطبيق.
ترسانة بايثون لتوليد البيانات العشوائية
بايثون بيوفر مجموعة مدهشة من الأدوات لتوليد البيانات العشوائية اللي معظم المطورين ما بيستكشفوهاش بالكامل. خلينا نشوف إيه اللي على الأغلب بتفوته.
أبعد من العشوائية الأساسية
وحدة random
في المكتبة القياسية هي مجرد قمة جبل الجليد:
“`python
import random
# Basic (and boring) approach
random_number = random.randint(1, 100)
random_choice = random.choice([‘apple’, ‘banana’, ‘cherry’])
random_sample = random.sample(range(100), 10)
# More interesting distributions
gaussian_value = random.gauss(0, 1) # Normal distribution
exponential_value = random.expovariate(1.5) # Exponential distribution
“`
اللي بيخلي ده قوي مش بس توليد الأرقام—لكن توليدها بالخصائص الإحصائية المناسبة لتتطابق مع أنماط البيانات في العالم الحقيقي.
Faker: صاحبك الجديد المفضل
لو مش بتستخدم Faker لحد دلوقتي، يبقى بتعمل اختبارات الأتمتة بالطريقة الصعبة. المكتبة دي بتنشئ بيانات وهمية واقعية بشكل مدهش:
“`python
from faker import Faker
fake = Faker()
# Create a realistic person
person = {
‘name’: fake.name(),
‘address’: fake.address(),
’email’: fake.email(),
‘job’: fake.job(),
‘company’: fake.company(),
‘credit_card’: fake.credit_card_number(),
‘user_agent’: fake.user_agent()
}
# Localized data
Faker.seed(42) # For reproducibility
fake_fr = Faker(‘fr_FR’)
french_person = {
‘name’: fake_fr.name(),
‘address’: fake_fr.address()
}
“`
اعرف المزيد في
قوالب الأوامر لـ ChatGPT
.
جعل العشوائية موثوقة (أيوه، دي حاجة حقيقية)
أكبر تحدي مع بيانات الاختبار العشوائية هو إعادة إنتاجها عندما يفشل الاختبار. بدون هذه القدرة، هتلاقي نفسك في كوابيس تصحيح الأخطاء وانت بتحاول إعادة تكوين الظروف اللي سببت الفشل.
إدارة البذور لإمكانية التكرار
البذور هي السر اللي بيخلي البيانات العشوائية عشوائية بشكل متوقع:
“`python
# Setting a global seed
import random
random.seed(1234) # All subsequent calls will be deterministic
# For pytest: use fixtures
import pytest
@pytest.fixture
def random_seed():
random.seed(42)
yield
# Reset after test
random.seed()
def test_with_predictable_randomness(random_seed):
assert random.randint(1, 10) == 1 # Will always be true with seed 42
“`
توليد سيناريوهات اختبار معقدة
للحصول على بيانات اختبار قوية فعلاً، ادمج عدة أساليب:
“`python
import random
from faker import Faker
from datetime import datetime, timedelta
def generate_user_activity(seed=None):
“””Generate a realistic user activity dataset with controlled randomness”””
if seed:
random.seed(seed)
Faker.seed(seed)
fake = Faker()
# Create base user
user = {
‘user_id’: fake.uuid4(),
‘name’: fake.name(),
‘signup_date’: fake.date_time_this_year()
}
# Generate 5-20 activity records
activity_count = random.randint(5, 20)
activities = []
last_date = user[‘signup_date’]
for _ in range(activity_count):
# Each activity happens 1 minute to 5 days after the previous
time_increment = timedelta(
seconds=random.randint(60, 5*24*60*60)
)
activity_time = last_date + time_increment
last_date = activity_time
# Activity types with weighted probability
activity_type = random.choices(
[‘login’, ‘purchase’, ‘page_view’, ‘logout’],
weights=[0.2, 0.1, 0.6, 0.1]
)[0]
activities.append({
‘timestamp’: activity_time,
‘activity’: activity_type,
‘details’: generate_activity_details(activity_type, fake)
})
return user, activities
“`
خرافات شائعة عن بيانات الاختبار العشوائية
خلينا نكشف بعض المفاهيم الخاطئة اللي ممكن تكون معطلة اختباراتك:
خرافة #1: البيانات العشوائية البحتة هي الأفضل
الحقيقة: البيانات العشوائية البحتة غالباً بتفوت حالات حدية مهمة. أفضل طريقة هي الجمع بين العشوائية المتحكم فيها وإدخال حالات حدية متعمدة. اختباراتك لازم تشمل كل من الحالات العامة العشوائية والحالات الحدية المحددة اللي انت عارف إنها ممكن تسبب مشاكل.
خرافة #2: بيانات الاختبار اليدوية أكثر موثوقية
الحقيقة: بيانات الاختبار اللي بيعملها البشر عادة ما بتكون أقل شمولاً وأكثر تحيزاً من البيانات المولدة برمجياً. احنا بنميل للتفكير في الحالات “العادية” وبنفوت التوليفات الغريبة اللي ممكن الآلات تكتشفها.
خرافة #3: الاختبار العشوائي يعني نتائج غير متوقعة
الحقيقة: مع إدارة البذور المناسبة، الاختبار العشوائي قابل للتكرار تماماً. المفتاح هو تسجيل قيم البذور الخاصة بك حتى تتمكن من إعادة توليد ظروف الاختبار الدقيقة عند الحاجة.
تطبيقات من العالم الحقيقي
إليك كيف تُحول البيانات العشوائية الأفضل سيناريوهات الاختبار الحقيقية:
اختبار ضغط قواعد البيانات
“`python
def generate_realistic_database_load(record_count=10000, seed=42):
“””Generate a realistic database test load with proper relationships”””
random.seed(seed)
fake = Faker()
Faker.seed(seed)
# Create users
users = []
for i in range(record_count // 10): # 1/10th of records are users
users.append({
‘id’: i+1,
‘name’: fake.name(),
’email’: fake.email(),
‘created_at’: fake.date_time_this_decade()
})
# Create orders (with relationships to users)
orders = []
for i in range(record_count):
user_id = random.randint(1, len(users))
orders.append({
‘id’: i+1,
‘user_id’: user_id,
‘amount’: round(random.uniform(10.0, 500.0), 2),
‘status’: random.choice([‘pending’, ‘completed’, ‘failed’, ‘refunded’]),
‘created_at’: fake.date_time_this_year()
})
return users, orders
“`
اختبار أتمتة النماذج
اختبار النماذج باستخدام Faker بيخلي اختبارات Selenium بتاعتك أكتر واقعية:
“`python
from selenium import webdriver
from faker import Faker
def test_registration_form():
driver = webdriver.Chrome()
fake = Faker()
try:
driver.get(“https://example.com/register”)
# Fill form with realistic data
driver.find_element_by_id(“first_name”).send_keys(fake.first_name())
driver.find_element_by_id(“last_name”).send_keys(fake.last_name())
# Generate a valid-looking but fake email
email = f”{fake.user_name()}@{fake.domain_name()}”
driver.find_element_by_id(“email”).send_keys(email)
# Generate a complex password
password = fake.password(length=12, special_chars=True)
driver.find_element_by_id(“password”).send_keys(password)
driver.find_element_by_id(“confirm_password”).send_keys(password)
# Complete address fields
address = fake.address().split(‘\n’)
driver.find_element_by_id(“address1”).send_keys(address[0])
if len(address) > 1:
driver.find_element_by_id(“address2”).send_keys(address[1])
driver.find_element_by_id(“city”).send_keys(fake.city())
driver.find_element_by_id(“state”).send_keys(fake.state())
driver.find_element_by_id(“zip”).send_keys(fake.postcode())
# Submit and verify success
driver.find_element_by_id(“submit”).click()
assert “Registration Successful” in driver.page_source
finally:
driver.quit()
“`
اعرف المزيد في
الاتساق الذاتي في الأوامر
.
إيه اللي جاي؟ الارتقاء ببيانات الاختبار إلى المستوى التالي
جاهز لرفع مستوى اختبارات الأتمتة بتاعتك بجد؟ فكر في التقنيات المتقدمة دي:
- مصانع البيانات: إنشاء أنماط توليد بيانات قابلة لإعادة الاستخدام خاصة بمجال تطبيقك
- اختبار قائم على الخصائص: بدلاً من حالات اختبار محددة، حدد الخصائص اللي يجب أن يستوفيها كودك دائماً
- اختبار الفوضى: إدخال أخطاء عشوائية متعمدة لاختبار المرونة
- بيانات اختبار مولدة بالذكاء الاصطناعي: استخدام التعلم الآلي لتحليل أنماط الإنتاج وتوليد بيانات اختبار أكثر واقعية
افتكر: أفضل بيانات اختبار بتبقى طبيعية، بتغطي حالات حدية غير متوقعة، وبتحميك من حالات طوارئ الإنتاج في نص الليل. نفسك المستقبلية (وجدول نومك) هيشكروك.
الأسئلة الشائعة
إزاي أثبت Faker؟
استخدم pip لتثبيت حزمة Faker:
pip install Faker
بعدين استوردها في سكريبتات بايثون بتاعتك بـ from faker import Faker
.
إزاي أقدر أولد نفس البيانات العشوائية عند الحاجة؟
دايماً اضبط واحفظ قيم البذور بتاعتك. مثال:
import random
from faker import Faker
# Set and log the seed value
seed_value = 12345
random.seed(seed_value)
Faker.seed(seed_value)
print(f"Using seed: {seed_value}")
# Now generate your random data
لما تحتاج تعيد إنشاء نفس البيانات، استخدم نفس قيمة البذرة.
ماذا لو احتجت بيانات اختبار خاصة بلغة معينة؟
Faker بيدعم العديد من ا