Bird
Raised Fist0
PyTesttesting~5 mins

Conditional parametrize in PyTest - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is parametrize in pytest?
Parametrize allows you to run the same test function with different input values, making tests efficient and organized.
Click to reveal answer
intermediate
How can you conditionally parametrize tests in pytest?
You can use Python code or fixtures to decide which parameters to pass, so tests run only with relevant data.
Click to reveal answer
intermediate
Example of using @pytest.mark.parametrize with a condition inside the test function.
You parametrize all data but skip or assert only for certain conditions inside the test using if statements.
Click to reveal answer
beginner
Why use conditional parametrize instead of multiple test functions?
It keeps tests DRY (Don't Repeat Yourself), easier to maintain, and runs only needed cases based on conditions.
Click to reveal answer
intermediate
What is a simple way to skip certain parameter sets in pytest based on a condition?
Use pytest.param with marks=pytest.mark.skipif(condition, reason='...') inside @pytest.mark.parametrize.
Click to reveal answer
What does @pytest.mark.parametrize do?
AGenerates test reports
BSkips a test unconditionally
CRuns tests in parallel
DRuns a test multiple times with different inputs
How can you skip a parameter set conditionally in pytest?
AUse <code>pytest.param(..., marks=pytest.mark.skipif(condition))</code>
BUse <code>pytest.skip()</code> inside the test
CUse <code>assert False</code> in the test
DRemove the parameter from the list
Why is conditional parametrize useful?
ATo run tests only with relevant inputs based on conditions
BTo avoid writing tests
CTo make tests slower
DTo run all tests regardless of input
Which Python feature helps decide parameters dynamically in pytest?
AList comprehension
BGlobal variables only
CIf statements and functions
DNo Python code can be used
What happens if a test is skipped using skipif in parametrize?
ATest fails
BTest is ignored and marked skipped
CTest runs normally
DTest crashes
Explain how to use conditional parametrize in pytest with an example.
Think about skipping some inputs based on a condition.
You got /4 concepts.
    Why is conditional parametrize better than writing multiple test functions for different inputs?
    Consider the DRY principle.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of using pytest.param with skipif inside @pytest.mark.parametrize?
      easy
      A. To mark tests as expected failures
      B. To run all test cases regardless of conditions
      C. To conditionally skip specific test cases based on environment or conditions
      D. To parametrize tests without any conditions

      Solution

      1. Step 1: Understand pytest.param with skipif

        This syntax allows marking individual parameters to be skipped if a condition is true.
      2. Step 2: Purpose of conditional skipping

        This helps run only relevant tests in certain environments, skipping others automatically.
      3. Final Answer:

        To conditionally skip specific test cases based on environment or conditions -> Option C
      4. Quick Check:

        Conditional skipping = skipif with pytest.param [OK]
      Hint: Use pytest.param with skipif to skip tests conditionally [OK]
      Common Mistakes:
      • Thinking skipif skips all tests, not just specific params
      • Confusing skipif with xfail
      • Not using pytest.param inside parametrize
      2. Which of the following is the correct syntax to skip a parameter when Python version is less than 3.8 using pytest.mark.parametrize?
      easy
      A. @pytest.mark.parametrize('x', [pytest.param(1, marks=pytest.mark.skipif(sys.version_info < (3,8), reason='Old Python'))])
      B. @pytest.mark.parametrize('x', [pytest.param(1, skipif=sys.version_info < (3,8))])
      C. @pytest.mark.parametrize('x', [pytest.param(1, marks=skipif(sys.version_info < (3,8)))])
      D. @pytest.mark.parametrize('x', [pytest.param(1, marks=pytest.skipif(sys.version_info < (3,8)))])

      Solution

      1. Step 1: Identify correct usage of skipif mark

        The skipif mark must be used inside pytest.mark.skipif with a reason string.
      2. Step 2: Check syntax correctness

        @pytest.mark.parametrize('x', [pytest.param(1, marks=pytest.mark.skipif(sys.version_info < (3,8), reason='Old Python'))]) correctly uses pytest.mark.skipif with condition and reason inside marks parameter.
      3. Final Answer:

        @pytest.mark.parametrize('x', [pytest.param(1, marks=pytest.mark.skipif(sys.version_info < (3,8), reason='Old Python'))]) -> Option A
      4. Quick Check:

        Use pytest.mark.skipif with marks and reason [OK]
      Hint: Use marks=pytest.mark.skipif(condition, reason='') inside pytest.param [OK]
      Common Mistakes:
      • Using skipif without pytest.mark
      • Omitting the reason argument
      • Passing skipif as a direct argument instead of marks
      3. Given the code below, what will be the output when running pytest on Python 3.7?
      import sys
      import pytest
      
      @pytest.mark.parametrize('num', [
          pytest.param(1, marks=pytest.mark.skipif(sys.version_info < (3,8), reason='Skip on old Python')),
          2,
          3
      ])
      def test_numbers(num):
          assert num > 0
      
      medium
      A. All three tests run and pass
      B. Test with num=1 is skipped; tests with num=2 and num=3 run and pass
      C. All tests are skipped
      D. Test with num=1 fails due to skipif syntax error

      Solution

      1. Step 1: Analyze skipif condition with Python 3.7

        sys.version_info < (3,8) is True for Python 3.7, so param with num=1 is skipped.
      2. Step 2: Check other parameters

        Parameters 2 and 3 have no skip marks, so their tests run and pass the assertion.
      3. Final Answer:

        Test with num=1 is skipped; tests with num=2 and num=3 run and pass -> Option B
      4. Quick Check:

        skipif True skips param; others run [OK]
      Hint: Check skipif condition against environment to predict skipped tests [OK]
      Common Mistakes:
      • Assuming all tests run regardless of skipif
      • Confusing skipif with xfail
      • Thinking skipif causes syntax error
      4. Identify the error in the following code snippet that uses conditional parametrize:
      import pytest
      
      @pytest.mark.parametrize('val', [
          pytest.param(10, marks=pytest.mark.skipif('sys.version_info < (3,8)', reason='Old Python')),
          20
      ])
      def test_val(val):
          assert val > 0
      
      medium
      A. The skipif condition is a string instead of a boolean expression
      B. Missing import of sys module
      C. pytest.param cannot be used inside parametrize
      D. The reason argument is missing in skipif

      Solution

      1. Step 1: Check skipif condition type

        The condition is passed as a string, but skipif expects a boolean expression, not a string.
      2. Step 2: Confirm other parts

        sys module is not imported, but the main error is the string condition. pytest.param usage and reason argument are correct.
      3. Final Answer:

        The skipif condition is a string instead of a boolean expression -> Option A
      4. Quick Check:

        skipif condition must be boolean, not string [OK]
      Hint: skipif condition must be a boolean expression, not a string [OK]
      Common Mistakes:
      • Passing condition as string instead of boolean
      • Ignoring missing sys import (not main error here)
      • Misusing pytest.param outside parametrize
      5. You want to run a test with parameters mode set to 'fast', 'slow', and 'medium'. However, you want to skip the 'slow' mode test only if an environment variable SKIP_SLOW is set to '1'. Which is the correct way to write this conditional parametrize in pytest?
      hard
      A. import os @pytest.mark.parametrize('mode', [ 'fast', pytest.param('slow', marks=pytest.mark.skipif('os.getenv("SKIP_SLOW") == "1"')), 'medium' ])
      B. import os @pytest.mark.parametrize('mode', [ 'fast', pytest.param('slow', skipif=os.getenv('SKIP_SLOW') == '1'), 'medium' ])
      C. import os @pytest.mark.parametrize('mode', [ 'fast', pytest.param('slow', marks=pytest.skipif(os.getenv('SKIP_SLOW') == '1')), 'medium' ])
      D. import os @pytest.mark.parametrize('mode', [ 'fast', pytest.param('slow', marks=pytest.mark.skipif(os.getenv('SKIP_SLOW') == '1', reason='Skip slow mode')), 'medium' ])

      Solution

      1. Step 1: Use os.getenv to check environment variable

        os.getenv('SKIP_SLOW') returns the value of the environment variable as a string.
      2. Step 2: Apply skipif mark correctly

        Use pytest.mark.skipif with a boolean condition and a reason inside marks parameter of pytest.param.
      3. Step 3: Verify syntax correctness

        import os @pytest.mark.parametrize('mode', [ 'fast', pytest.param('slow', marks=pytest.mark.skipif(os.getenv('SKIP_SLOW') == '1', reason='Skip slow mode')), 'medium' ]) correctly uses marks=pytest.mark.skipif(condition, reason='...') and imports os.
      4. Final Answer:

        import os @pytest.mark.parametrize('mode', [ 'fast', pytest.param('slow', marks=pytest.mark.skipif(os.getenv('SKIP_SLOW') == '1', reason='Skip slow mode')), 'medium' ]) -> Option D
      5. Quick Check:

        Use marks=pytest.mark.skipif with env check and reason [OK]
      Hint: Use os.getenv and marks=pytest.mark.skipif with reason to skip params [OK]
      Common Mistakes:
      • Passing skipif as direct argument instead of marks
      • Using string condition instead of boolean
      • Omitting reason in skipif mark
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard