1

I'm using

  • Python 3.6
  • Pytest 6.1.1
  • Pytest xdist 2.1.0
  • Pycharm 2018.3.7

Using HTML plugin for report as well with customization for the report

I'm running automation test via pycharm >pytest with arguments as below: --html=../../reports/report.html --self-contained-html -n 1 -k test_instalment_mtn_ng_unified_eco

in order to capture the screen during selenium, i'm using multprocessing, that start the capturing, and continue with the test

if i'm NOT using in arguments -n 1 ( means no workers) -test passed successfully ( include screen capture)

if i'm using -n 1 ( means 1 worker) pytest crush with the follow error:

mtn_ng_tests/mtn_ng_instalment_tests/test_instalment_mtn_ng_unified_eco.py::test_instalment_mtn_ng_unified_eco[customer buy 3 months happy flow while in light-instalment_mtn_ng_unified_eco_1-3-eco-48-40-0-10-ACTIVATED-ACTIVATED-owner_phone_unified_happy_flow_mtn_ng_eco-unified_mtn_instalment_subscribe_charge_event-activation_flow_mtn_unified_instalmant_and_unsub-no-unified_mtn_instalment_unsubscribe_charge_event-sms0-false-None-false-mtn_l20_unified--free_sms0-ACTIVATION-true-Assigned to customer-Ready For Install-false--components_end_time_delta0] 
INTERNALERROR> Traceback (most recent call last):
INTERNALERROR>   File "/home/ohad/.local/lib/python2.7/e2e/lib/python3.6/site-packages/_pytest/main.py", line 257, in wrap_session
INTERNALERROR>     session.exitstatus = doit(config, session) or 0
INTERNALERROR>   File "/home/ohad/.local/lib/python2.7/e2e/lib/python3.6/site-packages/_pytest/main.py", line 313, in _main
INTERNALERROR>     config.hook.pytest_runtestloop(session=session)
INTERNALERROR>   File "/home/ohad/.local/lib/python2.7/e2e/lib/python3.6/site-packages/pluggy/hooks.py", line 286, in __call__
INTERNALERROR>     return self._hookexec(self, self.get_hookimpls(), kwargs)
INTERNALERROR>   File "/home/ohad/.local/lib/python2.7/e2e/lib/python3.6/site-packages/pluggy/manager.py", line 93, in _hookexec
INTERNALERROR>     return self._inner_hookexec(hook, methods, kwargs)
INTERNALERROR>   File "/home/ohad/.local/lib/python2.7/e2e/lib/python3.6/site-packages/pluggy/manager.py", line 87, in <lambda>
INTERNALERROR>     firstresult=hook.spec.opts.get("firstresult") if hook.spec else False,
INTERNALERROR>   File "/home/ohad/.local/lib/python2.7/e2e/lib/python3.6/site-packages/pluggy/callers.py", line 208, in _multicall
INTERNALERROR>     return outcome.get_result()
INTERNALERROR>   File "/home/ohad/.local/lib/python2.7/e2e/lib/python3.6/site-packages/pluggy/callers.py", line 80, in get_result
INTERNALERROR>     raise ex[1].with_traceback(ex[2])
INTERNALERROR>   File "/home/ohad/.local/lib/python2.7/e2e/lib/python3.6/site-packages/pluggy/callers.py", line 187, in _multicall
INTERNALERROR>     res = hook_impl.function(*args)
INTERNALERROR>   File "/home/ohad/.local/lib/python2.7/e2e/lib/python3.6/site-packages/xdist/dsession.py", line 112, in pytest_runtestloop
INTERNALERROR>     self.loop_once()
INTERNALERROR>   File "/home/ohad/.local/lib/python2.7/e2e/lib/python3.6/site-packages/xdist/dsession.py", line 135, in loop_once
INTERNALERROR>     call(**kwargs)
INTERNALERROR>   File "/home/ohad/.local/lib/python2.7/e2e/lib/python3.6/site-packages/xdist/dsession.py", line 174, in worker_workerfinished
INTERNALERROR>     **assert not crashitem, (crashitem, node)**
INTERNALERROR> AssertionError: ('E2eAutomation/tests/mtn_ng_tests/mtn_ng_instalment_tests/test_instalment_mtn_ng_unified_eco.py::test_instalment_mtn_...ms0-ACTIVATION-true-Assigned to customer-Ready For Install-false--components_end_time_delta0]', <WorkerController gw0>)
INTERNALERROR> assert not 'E2eAutomation/tests/mtn_ng_tests/mtn_ng_instalment_tests/test_instalment_mtn_ng_unified_eco.py::test_instalment_mtn_n...e-mtn_l20_unified--free_sms0-ACTIVATION-true-Assigned to customer-Ready For Install-false--components_end_time_delta0]'

googled it for 2 days, and didnt found what could be the reason Attaching part of the test code Thanks in advance

# @pytest.mark.skip(reason='relax for now :)')
@pytest.mark.sanity
@pytest.mark.regression
@pytest.mark.instalment_mtn_ng
@pytest.mark.parametrize("scenario_description,unit,month,unit_type,customer_deal,time_unit_purchased,"
                         "set_desired,light_dark,unit_set_state,unit_expected_state,"
                         "owner_phone,charge_event_flow,activation_flow_job_scenario,"
                         "real_unit,charge_event_flow_unsub,sms,ipp_flow,set_product_id,free_triggered,instalment_type,"
                         "free_job_flow,free_sms,unit_status_during_process,valid_product,"
                         "set_crm_unit_status,get_crm_unit_status,set_last_day_of_month,notes,components_end_time_delta",
                         load_data_driven_for_test(profile='instalment_mtn_ng_eco'))
@pytest.mark.skipif(os.environ.get('DRY_RUN') == "True", reason="Jenkins Dry Run")
def test_instalment_mtn_ng_unified_eco(scenario_description, unit, month, unit_type, customer_deal, time_unit_purchased,
                                       set_desired, light_dark,
                                       unit_set_state, unit_expected_state, owner_phone, charge_event_flow,
                                       activation_flow_job_scenario, real_unit, charge_event_flow_unsub, sms, ipp_flow,
                                       set_product_id, free_triggered, instalment_type, free_job_flow, free_sms,
                                       unit_status_during_process, valid_product, set_crm_unit_status,
                                       get_crm_unit_status,
                                       set_last_day_of_month, notes, components_end_time_delta,
                                       setup, record_property):
    # ==================================================================================== Test yield from fixture

    lms_cursor, db_conn, lms_user, locale_sms, lms_db_connection, crm_db_connection, crm_cursor, soap_port = \
        setup[0], setup[1], setup[2], setup[3], setup[4], setup[5], setup[6], setup[7]

    # ====================================== Log creation ================================================
    os.environ['TEST_NUMBER'] = str(int(os.environ.get('TEST_NUMBER')) + 1)
    now = datetime.datetime.now()
    time_stamp = f"{now.year}{now.month}{now.day}{now.hour}{now.minute}{now.second}"
    os.environ['TEST_NAME'] = f"{os.path.basename(__file__)[:-3]}_#_{os.environ.get('TEST_NUMBER')}_" \
                                  f"{scenario_description.replace(' ', '_')}_" + time_stamp
    logging = setting_log.log_config.setup_logger()

    # ==================================================================================== Video recording
    if   os.environ.get('PYTEST_XDIST_WORKER_COUNT'):  # no workers so run with video capture
        video_record = multiprocessing.Process(target=ScreenVideo().execute_video_capturing)
        video_record.start()

        # ==================================================================================== Test Tear Down
        logging.info("test tear down")
        record_property("test_returns", {"screen_recorder": video_record})
        # record_property("test_returns", {"screen_recorder": video_record, "selenium_driver": automation_utils})
    else:
        logging.info("test tear down")
        record_property("test_returns", {})

    # ========================================================Initiate logs that not created in main fixture
    assert 1==2 (just to falied the test quicker)
hoefling
  • 59,418
  • 12
  • 147
  • 194
ohadshay
  • 225
  • 1
  • 3
  • 16
  • `-n1` doesn't mean "no workers". Rerun the test with `-n0` and check whether the assertion error is raised. – hoefling Oct 27 '20 at 20:19
  • i meant when i'm removing the -n 1 from the argument >>> it means i'm not using workers, and all run ok. example :html=../../reports/report.html --self-contained-html -k test_instalment_mtn_ng_unified_eco. the problem occured when i'm using -n 1 -the goal is to use several workers of course in order to run in parallel tests – ohadshay Oct 27 '20 at 21:44
  • When I do not use -n 3 in the arguments, it means I’m using no workers, and all tests will run one by one serially. So far so good. I also managed to run with workers (-n 3 for instance) and all tests run in parallel as expected. My problem started, when I add to test body (def test_1: for instance) multi processing ( for screen frame capture to run in background while test is running) Now, If I use no worksers but tests use multi processing, all run as expected. When I use workers, I get this exceptions ( it occurs only due to the multiprocessing in the test it self that I’m using – ohadshay Oct 27 '20 at 21:54

1 Answers1

1

I faced the same error a few days ago and I found that the bug is in the record_property fixture

For some reason, the record_property fixture does not accept receiving some types of data. In my case, I was trying to pass the response from an API request to the record_property fixture, something like:

record_property("api_res", res)

After several attempts, I created a workaround to send the response from API request via record_property fixture and store the informations that I needed:

@pytest.fixture
def store_api_response(record_property, request):
        record_property(
            'api_res', {
                'request_url': str(response.request.method + env + response.request.path_url),
                'headers': dict(response.request.headers),
                'request_body': response.request.body,
                'response_body': response_body,
                'status_code': str(response.status_code)
            }
        )
    return get_response

In your case, the error happens exactly on this line:

record_property("test_returns", {"screen_recorder": video_record})

The record_property fixture is not accepting the data stored in the video_record variable

Rafael C.
  • 2,245
  • 4
  • 29
  • 45