#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