Установите параметры условного создания в рамках робота

#robotframework

Вопрос:

В моем файле робота для конкретного теста я определил переменную uarts_to_test в списке числовых значений в разделе переменные:

 *** Variables ***
${uarts_to_test}    ['0', '1', '2', '3']
 

Теперь я хотел бы просмотреть этот список и создать define-DTEST_UART#, где # — индекс uart, для каждого числа, указанного в uarts_to_test. Я также хотел бы добавить все эти определения в переменную ${make_options}. Я попытался создать простую процедуру под ключевыми словами:

 *** Keywords ***
Determine which uarts to test
[Arguments]    @{uarts_to_test}
:FOR    ${item}    IN    @{uarts_to_test}
    IF List Should Contain Value ${i}
        ${make_options} = ${make_options} -DTEST_UART${i}
 

но я получаю только ошибку:

 Variable '${make_options}' not found.
 

Ответ №1:

Это мое решение. Я возвращаю параметры make в виде строки, а также в виде списка на случай, если потребуется дополнительная логика для элементов в списке.

 *** Settings ***
Library    Collections    

*** Variables ***
${uarts_to_test}    ['0', '1', '2', '3']

*** Test Cases ***
MakeOptionsTest
    ${make_options}    ${make_optionsList}    Determine which uarts to test    ${uarts_to_test}
    Log    ${make_options}
    Log List    ${make_optionsList}       
        
*** Keywords ***
Determine which uarts to test
    [Arguments]    ${uarts_to_test}
    ${make_optionsList}    Create List    
    ${uarts_to_test}    Evaluate    ${uarts_to_test}
    :FOR    ${item}    IN    @{uarts_to_test}
        Append To List    ${make_optionsList}    -DTEST_UART${item}
    ${make_options}   Evaluate    " ".join(${make_optionsList})
    [Return]    ${make_options}    ${make_optionsList}
 

Это выводится в консоль:

20210602 23:24:59.595 : ИНФОРМАЦИЯ : -DTEST_UART0-DTEST_UART1-DTEST_UART2-DTEST_UART3 20210602 23:24:59.596 : ИНФОРМАЦИЯ : Длина списка равна 4 и содержит следующие элементы: 0: -DTEST_UART0 1: -DTEST_UART1 2: -DTEST_UART2 3: -DTEST_UART3

Комментарии:

1. это сработало, спасибо! Хотя мне интересно, для чего нужна эта линия ${uarts_to_test} Evaluate ${uarts_to_test} ?

2. «для чего нужна строка ${uarts_to_test} Для оценки ${uarts_to_test}?» -> она используется для преобразования строкового значения скаляра ${uarts_to_test} в список, чтобы вы могли перебирать элементы в нем. Без него тип ${uarts_to_test} является просто чистой строкой.

Ответ №2:

Я не смог найти ${i} в вашем коде. Также нет объявления ${make_options}, поэтому, вероятно, оно не найдено. Вы можете использовать библиотеку коллекций, создать список и добавить в него элементы. вот так

 ***Settings***
    Library    Collections
    
    *** Variables ***
    @{uarts_to_test}    0    1    2    3
    
    ***Test Cases***
    test
        @{make_options}=    Create List
        FOR    ${uart}    IN    @{uarts_to_test} 
            Append To List    ${make_options}    -DTEST_UART${uart}
        END
        Log    ${make_options}
 

это будет записано в журнале ваших ${make_options}:

 ['-DTEST_UART0', '-DTEST_UART1', '-DTEST_UART2', '-DTEST_UART3']
 

Комментарии:

1. Я попробовал ваше решение, но ${make_options} у него есть дополнительные «у», и я не понимаю, почему… [u'-DTEST_UART0', u'-DTEST_UART2', u'-DTEST_UART3']

2. Хотя я поставил Determine which uart to test под *** Ключевые слова ***.

Ответ №3:

из ошибки Variable '${make_options}' not found. следует , что вы присваиваете переменную ${make_options} , прежде чем определить ее значение.

если вы возьмете пример первой итерации цикла, ваша переменная ${make_options} не определена ранее, и вы присваиваете ее переменной.

вы можете просто определить переменную ${mytext} и объединить ее в цикле, как показано ниже:

 *** Setting ***
Documentation     test1


*** Variables ***
@{uarts_to_test}    0    1    2    3    4
${mytext}    'DTEST_UART'

*** Test Cases ***
demo testing
    Determine which uarts to test    @{uarts_to_test}


*** Keywords ***
Determine which uarts to test
    [Arguments]    @{uarts_to_test}
    FOR    ${item}    IN    @{uarts_to_test}
        ${make_options}=     Catenate     ${mytext}    ${item}
        Log To Console     ${make_options} 
 

вывод на консоль:

 'DTEST_UART' 0
'DTEST_UART' 1
'DTEST_UART' 2
'DTEST_UART' 3
'DTEST_UART' 4