<aside> 💡
</aside>
یکی از کارایی که تو هر پروژه باید کنید ساخت سمپل دیتا هست برای اون پروژه
تو ریپو student app هم من همینکارو کردم که میتونید کل کدشو ببینید
خیلی خوبه که فانکشن هاتون کاملا از هم دیکاپل شده باشن و بگن چقدر از یک سمپل میخواین.
مثلا:
```python
def add_sample_data(
count_admin: int = 1,
count_classroom: int = 3,
count_advisor: int = 3,
count_student: int = 100,
count_teacher: int = 8,
) -> Type[Database]:
teachers = [create_teacher() for _ in range(count_teacher)]
classrooms = [create_classroom() for _ in range(count_classroom)]
students = [create_student() for _ in range(count_student)]
advisors = [create_advisor() for _ in range(count_advisor)]
admins = [create_admin() for _ in range(count_admin)]
for classroom in classrooms:
# Assign a random teacher to the classroom
teacher = random.choice(teachers)
relation = create_relation(classroom_id=classroom.id, teacher_id=teacher.id)
Database.add_relation(relation)
# Assign random students to the classroom
students_for_classroom = random.sample(
students, k=random.randint(1, len(students) // 2)
)
for student in students_for_classroom:
relation = create_relation(classroom_id=classroom.id, student_id=student.id)
Database.add_relation(relation)
Database.classrooms = classrooms
Database.teachers = teachers
Database.students = students
Database.admins = admins
Database.advisors = advisors
print(Database.read_relations())
return Database
def create_user(role: UserRoles) -> User:
return User(
role=role,
username=fake.name(),
password=fake.name(),
)
def create_classroom():
topics = ["MATH", "PHYSIC", "CHEMISTERY"]
classroom = ClassRoom(topic=random.choice(topics))
return classroom
def create_teacher() -> Teacher:
user = create_user(role=UserRoles.TEACHER)
return Teacher(user_id=user.id)
def create_student() -> Student:
user = create_user(role=UserRoles.STUDENT)
return Student(user_id=user.id)
def create_advisor() -> Advisor:
user = create_user(role=UserRoles.ADVISOR)
return Advisor(user_id=user.id)
def create_admin() -> Admin:
user = create_user(role=UserRoles.ADMIN)
return Admin(user_id=user.id)
def create_relation(
classroom_id: ClassRoomId,
student_id: StudentId | None = None,
teacher_id: TeacherId | None = None,
) -> ClassRoomRelation:
if int(student_id is None) + int(teacher_id is None) != 1:
raise ValueError("XOR of student_id and teacher_id")
return ClassRoomRelation(
teacher_id=teacher_id,
student_id=student_id,
classroom_id=classroom_id,
expires_at=datetime.now()
+ timedelta(days=random.randint(0, 30))
- timedelta(days=random.randint(0, 30)),
)
این expires_at چیه؟ همونطور که تو live گفتم نشون میده دانش آموز کی ریلیشنش با اون کلاس قطع میشه. مثلا دانش اموز یک سال درس میخونه دیگه درسته؟
۲ سوال دارم ازتون یکم فکر کنید میتونید جواب بدید
۱. چرا تو سمپل دیتا موقع ساختن من اومدم expıres-at رو تایم الان گرفتم بعد منهای ۱ تا ۳۰ روز (رندوم) کردم و بعدش دوباره رندوم (۱ تا ۳۰ روز) اضافه کردم؟
۲. چرا اصلا سمپل دیتا باید بنویسیم؟ به چه دردی میخوره؟ مزایاش چیه اگه مثلا سمپل دیتامون دامپ پروداکشن باشه؟ یا نسبت به حالتی که کلا سمپل دیتا نداریم؟
۱. تنوع یا diversity
۲. حجم یا scale
خیلی وقتا تستای ما پاس میشن, چون دیتایی که قبل از تستا ساختیم(تازه اگه ساخته باشیم) خوب ساخته نشدن. وقتی دارین سمپل دیتا میسازید برای هر آبجکت تمام حالت های ممکن رو باید داشته باشید تو سمپل دیتاتون. پروداکشن نمیتونه به ما تضمین بده که همه حالت هارو کاورد کرده.
نکته دوم اینه که حجم دیتا production دست ما نیست. پس نمیتونیم stress test بنویسیم. خود حجم دیتا هم ممکنه تاثیر گذار باشه رو pass شدن تستمون.
و نکته آخر اینه که برای استفاده از دیتا پروداکشن, اولا دارین به تمام developer ها این دسترسی رو میدین که جالب نیست. دوما دارید کل دیتابیس رو میذارین تو ریپازیتوری git اتون! که اینم جالب نیست.