Как выбрать переменную для скрипта Python из командной строки? - PullRequest
0 голосов
/ 26 ноября 2018

Мне нужно запустить тестовый скрипт Python для разных сред (разные URL).И мне нужно определить, какую переменную использовать из командной строки.В будущем этот параметр будет использоваться в задании Дженкинса.

script.py:

class TestLogin(unittest.TestCase):

    @allure.step
    def test_LoginValidation(self):

        devURL = "http://url1/admin/login/"
        stagingURL = "http://url2/admin/login/"
        prodURL = "https://url3/admin/login"

        driver.maximize_window()
        driver.implicitly_wait(10)
        driver.get(url)

        lp = LoginPage(driver)
        lp.login("login", "password")


        time.sleep(2)
        driver.quit()

В командной строке мне нужно написать

python script.py stagingURL

В результате вМетод test_LoginValidation в driver.get (url) будет использоваться URL, который я определил в командной строке.

Ответы [ 4 ]

0 голосов
/ 26 ноября 2018

Это почти наверняка легче сделать в Дженкинсе, чем в Python.Кроме того, кажется, имеет смысл, что ваш конвейер devops контролирует местоположение URI dev, staging и release (по крайней мере, настолько, насколько это разумно).на sys.argv[1] (это первый передаваемый ему аргумент) и используйте этот URL-адрес напрямую.

0 голосов
/ 26 ноября 2018

Вы можете использовать argparse для этого:

import argparse

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Description')

    parser.add_argument('--dev',
                        dest='dev',
                        action='store_true',
                        help="Help message")

    parser.add_argument('--stage',
                        dest='stage',
                        action='store_true',
                        help="Help message")

    parser.add_argument('--prod',
                        dest='prod',
                        action='store_true',
                        help="Help message")

    parser.set_defaults(dev=True,
                        stage=False,
                        action=False)

    args = parser.parse_args()

    url = None
    if args.dev:
        url = "http://url1/admin/login/"
    if args.stage:
        url = "http://url2/admin/login/"
    if args.prod:
        url = "https://url3/admin/login"

    # do something with the url

Это один из способов сделать это.Вы создаете некоторые параметры arg --dev, --stage, --prod и по умолчанию --dev имеет значение true.Вы также можете не иметь значения по умолчанию (просто установите dev=False).

Так что в следующий раз вы сможете запустить:

python program.py --dev
python program.py --stage
python program.py --prod

Возможно, вы захотите обработать случай, когда передается более одного флага.

Вы также можете сделать это следующим образом:

import argparse

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Description')

    parser.add_argument("--env", 
                        choices={"dev", "stage", "prod"}, 
                        help="Some help message.")

    args = parser.parse_args()

    url = None
    if args.env == "dev":
        url = "http://url1/admin/login/"
    elif args.env == "stage":
        url = "http://url2/admin/login/"
    elif args.env == "prod":
        url = "https://url3/admin/login"
    else:
        print("Please specify the environment using --env flag.")

    if url is not None:
        print(url)

Пример:

$ python3 test2.py
Please specify the environment using --env flag.

$ python3 test2.py --env prod
https://url3/admin/login

$ python3 test2.py --env stage
http://url2/admin/login/

$ python3 test2.py --env dev
http://url1/admin/login/

$ python3 test2.py --env wrong
usage: test2.py [-h] [--env {stage,dev,prod}]
test2.py: error: argument --env: invalid choice: 'wrong' (choose from 'stage', 'dev', 'prod')

Подробнее о argparse можно прочитать здесь .

0 голосов
/ 26 ноября 2018

Я могу порекомендовать click пакет для создания CLI.Это действительно просто, хорошо документировано, имеет много опций и, на мой взгляд, намного проще в использовании, чем argparse.

Пример:

import click

@click.command()
@click.option(
    '--count',
    default=1,
    help='Number of greetings.'
)
@click.option(
    '--name',
    prompt='Your name',
    help='The person to greet.'
)
def hello(**options):
    """Simple program that greets NAME for a total of COUNT times."""
    for x in range(options['count']):
        click.echo('Hello %s!' % options['name'])

if __name__ == '__main__':
    hello()

И как это выглядит при запуске:

$ python hello.py --count=3
Your name: John
Hello John!
Hello John!
Hello John!

Он автоматически генерирует красиво отформатированные страницы справки:

$ python hello.py --help
Usage: hello.py [OPTIONS]

  Simple program that greets NAME for a total of COUNT times.

Options:
  --count INTEGER  Number of greetings.
  --name TEXT      The person to greet.
  --help           Show this message and exit.

Вы можете получить библиотеку напрямую из PyPI:

pip install click

Если вы хотите создать CLI просто для параметризации модульного теста, вы можете рассмотреть возможность использования @pytest.mark.parametrize, который позволяет определить несколько наборов аргументов и фиксаторов в функции или классе теста.

Пример:

import pytest

class TestLogin(object):

    @pytest.mark.parametrize("url", [
        "http://url1/admin/login/",
        "http://url2/admin/login/",
        "https://url3/admin/login",
    ])
    def test_LoginValidation(self, url):
        driver.maximize_window()
        driver.implicitly_wait(10)
        driver.get(url)

        lp = LoginPage(driver)
        lp.login("login", "password")


        time.sleep(2)
        driver.quit()
0 голосов
/ 26 ноября 2018

То, что вы ищете, это argparse .Это должно позволить вам делать именно то, что вы ищете, например:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('url', help = 'The URL to use for ...', type = str)

Это устанавливает URL-адрес в качестве обязательного аргумента, который должен быть передан функции, и устанавливает его тип в str (этоэто поведение по умолчанию, но быть явным - это хорошо).

Затем вы можете извлечь аргументы, используя:

args = parser.parse_args()
specified_url = args.url

Отсюда вы можете продолжить, как обычно.Если вы хотите сделать аргумент необязательным, но со значением по умолчанию, это также возможно с помощью argparse.

Использование переменных среды работает, но намного сложнее в отладке, особенно если вы ожидаете, что этот скрипт будет запущен другимчасть программного обеспечения argparse гораздо надежнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...