【问题标题】:How can I update a parameter within a C# Class when running the application via a BAT file?通过 BAT 文件运行应用程序时,如何更新 C# 类中的参数?
【发布时间】:2019-04-26 15:12:20
【问题描述】:

我目前有一套使用 SpecFlow 和 C# 的 Selenium 自动化测试(IDE 是 Visual Studio 2017)。

我创建了一个批处理文件来运行适用的功能文件。

目前我使用以下属性在 Environments.cs 中设置我的测试环境(即 QA、UAT、Prod)

public static string CurrentEnvironment { get; set; } = uat;'

我想要实现的是如何通过批处理文件通过测试环境,因此在运行 BAT 文件之前无需打开解决方案和修改。

将来我可能希望通过此方法更新其他参数,例如 Specflow 参数,我可能希望覆盖参数值。

我尝试在谷歌上搜索解决方案,但我发现结构化我的问题并没有产生我想要的结果。

批处理文件:

ECHO ON

set Date=%date:~0,2%%date:~3,2%%date:~6,4%
set Time=%time:~0,2%%time:~3,2%

cd C:\Users\%username%\source\repos\AutomationTests\TestProject\packages\SpecRun.Runner.1.8.0\tools

SpecRun.exe run default.srprofile /basefolder:C:\Users\%username%\source\repos\AutomationTests\TestProject\TestProject\bin\Debug /filter:testpath:"Feature:TestFeature"

本质上,如果我的解决方案中的 CurrentEnvironment 属性设置为“UAT”,我希望能够通过 BAT 文件将其覆盖为“QA”。

我需要对 BAT 文件进行哪些修改以及对我的解决方案(如果有)进行哪些修改?

【问题讨论】:

  • 您总是可以考虑通过 SpecFlow 传入参数,并在 Program.cs 中设置环境参数。
  • @larry 谢谢。是的,这是一个考虑因素,但我想避免任何接触 C# 或 Specflow 的人修改任何源代码。不希望有人进行更改,然后如果他们签入该修改。
  • 那么也许让你的程序从文件中加载环境?
  • 如果您实际编辑原始 CS 文件,则必须重新构建整个程序,所以这是不可能的。

标签: c# batch-file selenium-webdriver specflow


【解决方案1】:

您可以使用环境变量设置测试环境。 Environment.GetEnvironmentVariable()是调用读取环境变量的方法。

这是一个例子:

Program.cs(在控制台应用中):

using System;

namespace TestEnvironmentVariable
{
    class Program
    {
        static void Main(string[] args)
        {
            string testEnvironment = Environment.GetEnvironmentVariable("test_env");
            Console.WriteLine($"Test environment: {testEnvironment}");
        }
    }
}

运行.bat:

set test_env=uat

TestEnvironmentVariable.exe

运行run.bat时:

>run.bat

>set test_env=uat

>TestEnvironmentVariable.exe
Test environment: uat

您还可以将所有设置放在一个 json 文件中,用作配置文件。它还可以在无需编译的情况下更改设置。这是一个小例子:

创建一个 json 文件,例如设置.json:

{
  "TestEnvironment": "UAT"
}

它可以在解决方案的根文件夹中创建。在文件的属性中,将复制到输出目录设置为始终复制如果较新则复制。这确保它被移动到二进制输出目录。

然后创建一个 Settings.cs 文件,它代表我们将 json 文件反序列化为的类:

namespace TestEnvironmentVariable
{
    public sealed class Settings
    {
        public Settings() { }

        public string TestEnvironment { get; set; }
    }
}

您可以在需要时在此处添加更多变量。 json 文件应该具有相同的变量。然后是反序列化的代码:

using System.IO;
using Newtonsoft.Json;

namespace TestEnvironmentVariable
{
    public static class SettingsUtil
    {
        public static T GetObjectFromJsonFile<T>(string filename)
        {
            string json = File.ReadAllText(filename);
            var deserializedObject = JsonConvert.DeserializeObject<T>(json);

            return deserializedObject;
        }
    }
}

您必须使用 NuGet 添加 Newtonsoft.Json。然后我们可以在我们的代码中读取 json 文件:

using System;

namespace TestEnvironmentVariable
{
    class Program
    {
        static void Main(string[] args)
        {
            Settings settings = SettingsUtil.GetObjectFromJsonFile<Settings>("settings.json");
            Console.WriteLine($"Test environment: {settings.TestEnvironment}");
        }
    }
}

输出:

>TestEnvironmentVariable.exe
Test environment: UAT

【讨论】:

  • 谢谢。我想我会尝试 JSON 方法。试用后将标记为已回答
猜你喜欢
  • 2013-10-02
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 2011-09-10
  • 2020-08-22
相关资源
最近更新 更多