Elixir 1.7

ExUnit.Case




elixir

ExUnit.Case

परीक्षण मामलों को परिभाषित करने के लिए सहायक।

इस मॉड्यूल को अन्य मॉड्यूल में कॉन्फ़िगर करने और परीक्षण के लिए तैयार करने के तरीके के रूप में उपयोग किया जाना चाहिए।

जब उपयोग किया जाता है, तो यह निम्नलिखित विकल्पों को स्वीकार करता है:

  • :async - अन्य मॉड्यूल में परीक्षणों के साथ समवर्ती चलाने के लिए इस मॉड्यूल में परीक्षण कॉन्फ़िगर करता है। एक ही मॉड्यूल में टेस्ट समवर्ती रूप से नहीं चलते हैं। यह तभी सक्षम होना चाहिए जब परीक्षण किसी वैश्विक स्थिति को नहीं बदलते हैं। false अवहेलना।

इस मॉड्यूल में स्वचालित रूप से ExUnit.Callbacks में परिभाषित सभी कॉलबैक शामिल हैं। setup , start_supervised , on_exit और परीक्षण प्रक्रिया जीवनचक्र पर अधिक जानकारी के लिए उस मॉड्यूल को देखें।

एक साथ परीक्षण समूहीकरण के लिए, इस मॉड्यूल में describe/2 देखें।

उदाहरण

 defmodule AssertionTest do
   # Use the module
   use ExUnit.Case, async: true

   # The "test" macro is imported by ExUnit.Case
   test "always pass" do
     assert true
   end
 end

प्रसंग

सभी परीक्षणों में एक तर्क के रूप में एक संदर्भ प्राप्त होता है। संदर्भ कॉलबैक और परीक्षणों के बीच जानकारी साझा करने के लिए विशेष रूप से उपयोगी है:

defmodule KVTest do
  use ExUnit.Case

  setup do
    {:ok, pid} = KV.start_link
    {:ok, pid: pid}
  end

  test "stores key-value pairs", context do
    assert KV.put(context[:pid], :hello, :world) == :ok
    assert KV.get(context[:pid], :hello) == :world
  end
end

जैसा कि संदर्भ एक नक्शा है, यह जानकारी निकालने के लिए पैटर्न से मेल खा सकता है:

test "stores key-value pairs", %{pid: pid} do
  assert KV.put(pid, :hello, :world) == :ok
  assert KV.get(pid, :hello) == :world
end

टैग

संदर्भ का उपयोग कॉलबैक से परीक्षण तक की जानकारी को पास करने के लिए किया जाता है। कॉलबैक में परीक्षण से जानकारी पारित करने के लिए, ExUnit टैग प्रदान करता है।

परीक्षण को टैग करके, टैग मान को संदर्भ में एक्सेस किया जा सकता है, जिससे डेवलपर को परीक्षण को अनुकूलित करने की अनुमति मिलती है। आइए एक उदाहरण देखें:

defmodule FileTest do
  # Changing directory cannot be async
  use ExUnit.Case, async: false

  setup context do
    # Read the :cd tag value
    if cd = context[:cd] do
      prev_cd = File.cwd!
      File.cd!(cd)
      on_exit fn -> File.cd!(prev_cd) end
    end

    :ok
  end

  @tag cd: "fixtures"
  test "reads UTF-8 fixtures" do
    File.read("hello")
  end
end

ऊपर दिए गए उदाहरण में, हमने एक टैग को परिभाषित किया है :cd जिसे सेटअप कॉलबैक में पढ़ा जाता है ताकि कार्यशील निर्देशिका को कॉन्फ़िगर किया जा सके।

जब केस टेम्प्लेट ( ExUnit.CaseTemplate ) के साथ उपयोग किया जाता है तो टैग बहुत प्रभावी होते हैं, जो परीक्षण के व्यवहार को अनुकूलित करने के लिए केस टेम्प्लेट में कॉलबैक की अनुमति देता है।

नोट टैग को दो अलग-अलग तरीकों से सेट किया जा सकता है:

@tag key: value
@tag :key       # equivalent to setting @tag key: true

यदि एक टैग को एक से अधिक बार दिया जाता है, तो अंतिम मान जीत जाता है।

मॉड्यूल और टैग का वर्णन करें

एक मॉड्यूल में सभी परीक्षणों के लिए एक टैग सेट किया जा सकता है या क्रमशः संदर्भ के अंदर @moduletag या @describetag सेट करके ब्लॉक का वर्णन करें:

defmodule ApiTest do
  use ExUnit.Case
  @moduletag :external

  describe "makes calls to the right endpoint" do
    @describetag :endpoint

    # ...
  end
end

यदि आप @moduletag सेट कर रहे हैं, तो आपको यह सेट करना होगा कि आपके कॉल के बाद use ExUnit.Case का use ExUnit.Case या आपको संकलन त्रुटियाँ दिखाई देंगी।

यदि उसी कुंजी को @tag माध्यम से सेट किया जाता है, तो @tag मान में उच्च प्राथमिकता होती है।

ज्ञात टैग

निम्नलिखित टैग एक्सयूनाइट द्वारा स्वचालित रूप से सेट किए गए हैं और इसलिए आरक्षित हैं:

  • :module - वह मॉड्यूल जिस पर परीक्षण परिभाषित किया गया था
  • :file - वह फ़ाइल जिस पर परीक्षण परिभाषित किया गया था
  • :line - वह रेखा जिस पर परीक्षण परिभाषित किया गया था
  • :test - परीक्षण नाम
  • :async - यदि परीक्षण का मामला async मोड में है
  • :registered - ExUnit.Case.register_attribute/3 मान के लिए उपयोग किया जाता है
  • :describe - वर्णन ब्लॉक परीक्षण के अंतर्गत आता है

निम्नलिखित टैग अनुकूलित करते हैं कि परीक्षण कैसे व्यवहार करते हैं:

  • :capture_log - नीचे "लॉग कैप्चर" अनुभाग देखें
  • :skip - दिए गए कारण के साथ परीक्षण को :skip देता है
  • :timeout - मिलीसेकंड में परीक्षा के समय को अनुकूलित करता है (60000 तक की चूक)

:test_type टैग स्वचालित रूप से ExUnit द्वारा सेट किया गया है, लेकिन आरक्षित नहीं है । यह टैग उपयोगकर्ताओं को यदि वे चाहें तो अनुकूलित करने के लिए उपलब्ध हैं।

फिल्टर

टैग का उपयोग विशिष्ट परीक्षणों की पहचान करने के लिए भी किया जा सकता है, जिन्हें बाद में फ़िल्टर का उपयोग करके शामिल या बाहर रखा जा सकता है। सबसे आम कार्यक्षमता कुछ विशेष परीक्षणों को चलाने से बाहर करना है, जिसे ExUnit.configure/1 माध्यम से किया जा सकता है:

# Exclude all external tests from running
ExUnit.configure(exclude: [external: true])

अब से, ExUnit किसी भी परीक्षण को नहीं चलाएगा जिसमें external ध्वज को true सेट किया गया true । इस व्यवहार को इसके साथ उलटा किया जा सकता है :include विकल्प :include जो आमतौर पर कमांड लाइन के माध्यम से पारित किया जाता है:

mix test --include external:true

मिक्स के माध्यम से फिल्टर चलाने के तरीके के बारे में अधिक जानकारी के लिए रन mix help test

टैग और फिल्टर के लिए एक और उपयोग मामला उन सभी परीक्षणों को बाहर करने के लिए है जो डिफ़ॉल्ट रूप से किसी विशेष टैग के होते हैं, भले ही इसके मूल्य की परवाह किए बिना, और केवल एक निश्चित सबसेट शामिल करें:

ExUnit.configure(exclude: :os, include: [os: :unix])

ध्यान रखें कि सभी परीक्षण डिफ़ॉल्ट रूप से शामिल किए जाते हैं, इसलिए जब तक उन्हें पहले बाहर नहीं किया जाता है, तब तक include विकल्प का कोई प्रभाव नहीं होता है।

लॉग कैप्चर करें

ExUnit वैकल्पिक रूप से एक परीक्षण के दौरान उत्पन्न होने वाले लॉग संदेशों की छपाई को दबा सकता है। परीक्षण चलाने के दौरान उत्पन्न लॉग संदेश कैप्चर किए जाते हैं और केवल यदि परीक्षण विफल हो जाता है तो वे डीबगिंग के साथ सहायता के लिए मुद्रित होते हैं।

आप उन्हें अलग-अलग परीक्षणों के लिए इस व्यवहार में शामिल कर सकते हैं :capture_log उन्हें कैप्चर करें या एक्ज़िट परीक्षा में सभी परीक्षणों के लिए लॉग कैप्चर सक्षम करें:

ExUnit.start(capture_log: true)

इस डिफ़ॉल्ट को @tag capture_log: false या @moduletag capture_log: false @tag capture_log: false द्वारा ओवरराइड किया जा सकता है।

चूंकि setup_all ब्लॉक एक विशिष्ट परीक्षण से संबंधित नहीं हैं, उनमें (या परीक्षण के बीच) लॉग संदेश कभी भी कैप्चर नहीं किए जाते हैं। यदि आप इन संदेशों को भी दबाना चाहते हैं, तो विश्व स्तर पर कंसोल बैकएंड को हटा दें:

config :logger, backends: []

सारांश

कार्य

describe/2

एक साथ परीक्षण का वर्णन करता है

register_attribute (env, name, opts \\ [])

ExUnit.Case परीक्षण के दौरान उपयोग की जाने वाली एक नई विशेषता को पंजीकृत करता है

register_test (नक्शा, test_type, नाम, टैग)

इस मामले के हिस्से के रूप में चलाने के लिए एक फ़ंक्शन पंजीकृत करता है

test(message)

एक स्ट्रिंग के साथ लागू नहीं परीक्षण को परिभाषित करता है

परीक्षण (संदेश, var \\ उद्धरण () do _ अंत, सामग्री)

एक स्ट्रिंग के साथ एक परीक्षण को परिभाषित करता है

कार्य

वर्णन (संदेश, सूची) (मैक्रो)

एक साथ परीक्षण का वर्णन करता है।

प्रत्येक वर्णन ब्लॉक को एक नाम मिलता है जो आगामी परीक्षणों के लिए उपसर्ग के रूप में उपयोग किया जाता है। किसी ब्लॉक के अंदर, ExUnit.Callbacks.setup/1 लगाया जा सकता है और यह केवल वर्तमान ब्लॉक के लिए चलाने के लिए एक सेटअप कॉलबैक को परिभाषित करेगा। वर्णन नाम को एक टैग के रूप में भी जोड़ा जाता है, जिससे डेवलपर्स को विशिष्ट ब्लॉकों के लिए परीक्षण चलाने की अनुमति मिलती है।

उदाहरण

defmodule StringTest do
  use ExUnit.Case, async: true

  describe "String.capitalize/1" do
    test "first grapheme is in uppercase" do
      assert String.capitalize("hello") == "Hello"
    end

    test "converts remaining graphemes to lowercase" do
      assert String.capitalize("HELLO") == "Hello"
    end
  end
end

मिक्स का उपयोग करते समय, आप नाम से वर्णन ब्लॉक में सभी परीक्षण चला सकते हैं:

mix test --only describe:"String.capitalize/1"

या सटीक लाइन पास करके वर्णन ब्लॉक शुरू होता है:

mix test path/to/file:123

नोट वर्णन ब्लॉक को नेस्टेड नहीं किया जा सकता है। रचना के लिए पदानुक्रम पर निर्भर होने के बजाय, डेवलपर्स को नामित सेटअप के शीर्ष पर निर्माण करना चाहिए। उदाहरण के लिए:

defmodule UserManagementTest do
  use ExUnit.Case, async: true

  describe "when user is logged in and is an admin" do
    setup [:log_user_in, :set_type_to_admin]

    test ...
  end

  describe "when user is logged in and is a manager" do
    setup [:log_user_in, :set_type_to_manager]

    test ...
  end

  defp log_user_in(context) do
    # ...
  end
end

नामित सेटअपों के पक्ष में पदानुक्रमों को मना करने पर, डेवलपर के लिए प्रत्येक विवरण ब्लॉक पर नज़र डालना और शामिल किए गए सेटअप चरणों को जानना ठीक है।

register_attribute (env, name, opts \\ [])

ExUnit.Case परीक्षण के दौरान उपयोग की जाने वाली एक नई विशेषता को पंजीकृत करता है।

गुण मान context.registered में एक कुंजी / मान युग्म के रूप में उपलब्ध होंगे। context.registered । कुंजी / मान जोड़े को प्रत्येक ExUnit.Case.test/3 @tag समान के बाद साफ़ किया जाएगा।

Module.register_attribute/3 का उपयोग विशेषता को पंजीकृत करने के लिए किया जाता है, यह फ़ंक्शन समान विकल्प लेता है।

उदाहरण

defmodule MyTest do
  use ExUnit.Case
  ExUnit.Case.register_attribute __ENV__, :foobar

  @foobar hello: "world"
  test "using custom test attribute", context do
    assert context.registered.hello == "world"
  end
end

register_test (नक्शा, test_type, नाम, टैग)

इस मामले के हिस्से के रूप में चलाने के लिए एक फ़ंक्शन पंजीकृत करता है।

यह 3 पार्टी प्रोजेक्ट्स द्वारा उपयोग किया जाता है, क्विकचेक की तरह, मैक्रो को property/3 तरह लागू करने के लिए जो test तरह काम करता है लेकिन इसके बजाय एक संपत्ति को परिभाषित करता है। इस फ़ंक्शन को लागू करने के उदाहरण के लिए test/3 कार्यान्वयन देखें।

परीक्षण प्रकार को एक स्ट्रिंग में परिवर्तित किया जाएगा और प्रदर्शन के लिए बहुलित किया जाएगा। आप कस्टम बहुवचन सेट करने के लिए ExUnit.plural_rule/2 का उपयोग कर सकते हैं।

परीक्षण (संदेश) (मैक्रो)

एक स्ट्रिंग के साथ लागू नहीं परीक्षण को परिभाषित करता है।

एक सुविधाजनक मैक्रो प्रदान करता है जो एक स्ट्रिंग के साथ परीक्षण को परिभाषित करने की अनुमति देता है, लेकिन अभी तक लागू नहीं किया गया है। परिणामी परीक्षण हमेशा विफल रहेगा और "लागू नहीं" त्रुटि संदेश मुद्रित करेगा। परिणामी परीक्षण मामले को भी :not_implemented साथ टैग किया :not_implemented

उदाहरण

test "this will be a test in future"

परीक्षण (संदेश, var \\ उद्धरण () do _ अंत, सामग्री) (मैक्रो)

एक स्ट्रिंग के साथ एक परीक्षण को परिभाषित करता है।

एक सुविधाजनक मैक्रो प्रदान करता है जो एक स्ट्रिंग के साथ परीक्षण को परिभाषित करने की अनुमति देता है। यह मैक्रो स्वचालित रूप से परमाणु को सम्मिलित करता है :ok परीक्षण की अंतिम पंक्ति के रूप में :ok । उस ने कहा, एक पासिंग टेस्ट हमेशा लौटता है :ok , लेकिन, इससे भी महत्वपूर्ण बात यह है कि यह अमृत को टेल कॉल न करने के लिए मजबूर करता है और टेस्ट को ऑप्टिमाइज़ करता है और इसलिए बैकट्रेस से लाइनों को छिपाने से बचता है।

उदाहरण

test "true is equal to true" do
  assert true == true
end