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

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

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 Like

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

3 Likes

درود @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 Like

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

1 Like

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

2 Likes

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

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

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

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

2 Likes