استفاده از یک تست در تست دیگر

با درود خدمت شما یک تست کوچیکی رو نوشتم برای یکی از برنامه هام برای تمرین تست نویسی یک مشکلی برخورد کردم بخاطر اینکه تست در سندباکس دیتابیس می ره در هر تست جدید و مجزا انگار چیزی در دیتابیس نیست به عنوان مثال

defmodule Khatoghalam.AdminUserTest do
  use ExUnit.Case, async: true
  use Khatoghalam.DataCase
  alias Khatoghalam.Admin.Users.UserQuery

  @user %{name: "shahryar", last_name: "tavakkoli", username: "shahryar", gender: 1, email: "[email protected]", password: "32505", status: 1, role: 3}

  describe "Happy | Admin Users basic CRUD registration (▰˘◡˘▰)" do
    test "add user" do
      {:ok, :user_add, _user_info} = assert UserQuery.add_user(@user)
    end

    test "edit user with id" do
      {:ok, :user_add, user_info} = assert UserQuery.add_user(@user)
      user_edit =  %{name: "shahryar_edit", last_name: "tavakkoli_test", username: "shahryar", gender: 2, email: "[email protected]", password: "32505", status: 1, role: 3}
      {:ok, :edit_user, _info} = assert UserQuery.edit_user(user_info.id, user_edit)
    end

    test "read user with email" do
      {:ok, :user_add, user_info} = assert UserQuery.add_user(@user)
      {:ok, :find_user_with_email, _user_info} = assert UserQuery.find_user_with_email(user_info.email)
    end

    test "delete user with id" do
      {:ok, :user_add, user_info} = assert UserQuery.add_user(@user)
      {:ok, :delete_user, _struct} = assert UserQuery.delete_user(user_info.id)
    end
  end
end

در تست اول من یک کاربر اضافه کردم حالا در تست بعدی که باید ویرایش بشه من مجبورم دوباره یک کاربر ایجاد کنم آیا امکان این هست که test در تست دیگه استفاده بشه؟ می تونم فانکشن جدا غیر تست درست کنم با اطلاعات پایه ای ولی بیشتر سوالمه برای تست نویسی همچنین استراکچری رو جلو می رند یا کلا من دارم اشتباه جلو می رم ؟

با تشکر

با الکسیر کار نکردم و مسلما نمیدونم سیستم تست نویسی براش چطوریه و البته نمیدونم کار با دیتابیس به چه صورت هست.

ولی مشکل مشابه بارها داشتم. آیا مشکل به خاطر این نیست که کوئریهای insert و update دیتابیس، commit نمیشن؟ آیا اگه کامیت بشن و واقعا برن توی دیتابیس اوکی نمیشه؟

1 پسندیده

سلام امیدوارم خوب باشید
در اکثر فریورک های تست دیتابیس پاک میشه بعد هر تست و باید هم همینطور باشه تا state در هر تست یکنواخت باشه و اجرا تصادفی تاثیر درتست ها نداشته باشه برای اینکه یک کار قبل هر تست انجام بشه از setup استفاده کن

3 پسندیده

درود @pouya-abbassi جان عزیز مشکلم فقط این بود که احساس می کنم زیادی دارم از کوآری هاش اسفاده می کنم.

نه عزیز در فکر نکنم چون در توضیحاتش گفته بود فکر کنم که پاک می شه چون از سندباکس استفاده می کنه حتی به صورت مثال

تنظیمات دیتابیس معمولی

config :khatoghalam, Khatoghalam.Repo,
  username: "postgres",
  password: "password",
  database: "khatoghalam_dev",
  hostname: "localhost",
  pool_size: 10,
  port: "5433",
  migration_lock: nil

تنظیمات دیتابیس تست

config :khatoghalam, Khatoghalam.Repo,
  username: "postgres",
  password: "password",
  database: "khatoghalam_test",
  hostname: "localhost",
  port: "5433",
  migration_lock: nil,
  pool: Ecto.Adapters.SQL.Sandbox

لطفا به اون pool نگاهی بکنید

1 پسندیده

درود سام عزیز. پس بخاطر همین بود که قبل از کانفیگش توی توضیحاتی در یکی از ارور ها می گفت حتما باید تست جوری باشه که در یک نود خاص باشه و تداخلی پیش نیاد. ممنونم ازت امید وارم همیشه در سلامتی باشی
تشکر :rose::rose:

1 پسندیده

بله دقیقا تست ها باید بدون درنظر گرفتن ترتیب یا زمان اجرا همیشه یک جواب بدهند
و Idempotent باشند
هیچ مشکلی با database شما نیست الیکسیر داره درست کار میکنه

2 پسندیده

اون کلمه کلیدی رو سام عزیز فرمودند حالا باهاش می شه سرچ خوبی کرد دوتا مطلب خوب پیدا کردم که مشکلم کامل حل شد

یکی لینک زیر هست

https://hexdocs.pm/ex_unit/ExUnit.Callbacks.html#setup_all/2

و در این سایت هم یک مثال ساده و کامل

2 پسندیده