Программный запуск приложения-функции не работает без описательного вывода

Конечная цель - я хочу запустить приложение-функцию локально для автоматического тестирования. Я не знаю, как это сделать без использования func.exe. Вот моя попытка:

    /// <summary>
    /// Setup environment for running integration tests on MyApp APIs
    /// </summary>
    /// <param name="testContext"></param>
    [ClassInitialize]
    public static void RunFileHubLocally(TestContext testContext)
    {
        // Do the programmatic equivalent of right-click "Debug -> Start new instance" on API.
        // This uses Azure Functions Core CLI to deploy the Function App locally.
        azureFunctionsCliShell = new Process();

        azureFunctionsCliShell.StartInfo.UseShellExecute = false;
        azureFunctionsCliShell.StartInfo.RedirectStandardOutput = true;
        azureFunctionsCliShell.StartInfo.CreateNoWindow = true;

        azureFunctionsCliShell.StartInfo.FileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\..\..\lib\azure-functions-core-tools\func.exe"); ;
        var fileInTargettedWorkingDirectory = new FileInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\..\..\..\..\..\src\MyApp.Api\bin\Debug\netcoreapp2.1\host.json"));
        azureFunctionsCliShell.StartInfo.WorkingDirectory = fileInTargettedWorkingDirectory.Directory.FullName;
        int port = FreeTcpPort();
        azureFunctionsCliShell.StartInfo.Arguments = $"host start --port {port}";
        apiUrl = $"http://localhost:{port}/api";
        azureFunctionsCliShell.Start();

        // Wait for "Application started", the line in the output that indicates the
        // application is listening to the port
        const string specialPhrase = "Application started";
        for ( ; ; )
        {
            string line = azureFunctionsCliShell.StandardOutput.ReadLine();

            Console.WriteLine(line);

            if (line.Contains(specialPhrase))
            {
                break;
            }

            if (azureFunctionsCliShell.StandardOutput.EndOfStream)
            {
                throw new Exception($"Output did not contain special phrase '{specialPhrase}'. Last line: '{line}'.");
            }
        }

        // Hold instance of HttpClient to be disposed of during cleanup
        httpClient = new HttpClient();
    }

Это не с выходом

ваша рабочая среда выполнения не установлена. Начиная с версии 2.0.1-beta.26, требуется настройка рабочего времени. Запустите func settings add FUNCTIONS_WORKER_RUNTIME <option> или добавьте FUNCTIONS_WORKER_RUNTIME в свой local.settings.json Доступные параметры: dotnet, node, python, powershell

              %%%%%%
             %%%%%%
        @   %%%%%%    @
      @@   %%%%%%      @@
   @@@    %%%%%%%%%%%    @@@
 @@      %%%%%%%%%%        @@
   @@         %%%%       @@
     @@      %%%       @@
       @@    %%      @@
            %%
            %

Основные инструменты функций Azure (2.6.666 хэш фиксации: 2ea98edb55cd2fc249765fcf3f5e30829c7c9932) Версия среды выполнения функции: 2.0.12408.0 Приложение завершает работу ...

Когда я запускаю ту же команду через консоль, она преуспевает с

ваша рабочая среда выполнения не установлена. Начиная с версии 2.0.1-beta.26 требуется настройка рабочего времени. Запустите func settings add FUNCTIONS_WORKER_RUNTIME <option> или добавьте FUNCTIONS_WORKER_RUNTIME в свой local.settings.json Доступные параметры: dotnet, node, python, powershell

              %%%%%%
             %%%%%%
        @   %%%%%%    @
      @@   %%%%%%      @@
   @@@    %%%%%%%%%%%    @@@
 @@      %%%%%%%%%%        @@
   @@         %%%%       @@
     @@      %%%       @@
       @@    %%      @@
            %%
            %

Основные инструменты функций Azure (2.6.666 хэш фиксации: 2ea98edb55cd2fc249765fcf3f5e30829c7c9932) Версия среды выполнения функции: 2.0.12408.0 [26 апреля 2019 г., 14:29:18] Запуск службы инициализации Rpc. [26.04.2019 14:29:18] Инициализация RpcServer…… Теперь слушаем: http://0.0.0.0:63819 Приложение запущено. Нажмите Ctrl + C, чтобы выключить.


person See Sharp    schedule 26.04.2019    source источник
comment
Я хочу запустить приложение-функцию локально для автоматического тестирования - разве вы не можете использовать методы, описанные в Стратегии тестирования вашего кода в Функциях Azure?   -  person stuartd    schedule 26.04.2019
comment
@stuartd Я знаю, как проводить модульное тестирование своих функций. Мне нужны правильные интеграционные тесты, живая конечная точка HTTP.   -  person See Sharp    schedule 26.04.2019
comment
Извините, я не поняла. Я немного сбит с толку - вы говорите, что не знаете, как запустить сценарий без использования func.exe, но в вашем примере кода используется func.exe, поскольку process.StartInfo.FileName. Вы говорите Когда я запускаю ту же команду через консоль, она выполняется - вы имеете в виду, что вызов func.exe с точно такой же командой работает в командном окне, но не при вызове Process.Start? Вы пробовали вызывать код из консольной программы, а не из теста?   -  person stuartd    schedule 26.04.2019


Ответы (1)


func CLI сам по себе является оболочкой для среды выполнения функций Azure.

Вместо того, чтобы писать еще одну оболочку для func CLI, вы могли бы вместо этого перейти на _ 3_ route, который будет таким же близким, как запуск в самом Azure.

С помощью docker вы значительно упростите общие конвейеры CI, поскольку большинство серверов CI изначально поддерживают выполнение рабочих процессов с контейнерами.

Кроме того, при желании вы также можете развернуть эти контейнеры в Azure. но обратите внимание, что Linux еще не поддерживается для плана потребления, поэтому вам придется использовать План обслуживания приложений Linux.

person PramodValavala-MSFT    schedule 01.05.2019