4

我遇到了一些障碍,希望有人能提供帮助!

我编写了一个作为单元测试运行器的 Metro 应用程序,现在我需要能够无头调用此应用程序,以便在构建过程中将其用于验证。Metro 应用程序的工作方式是运行一堆单元测试,生成一个包含测试结果的 XML 文件,并将结果显示给用户。

理想情况下,我将有一个简单的脚本来运行 Metro 应用程序、执行测试、退出应用程序,然后能够读取生成的 XML 文件中的结果。这可能吗?如果可以,最好的方法是什么?

以下是一些更具体的问题:

  1. 如何无头启动 Metro 应用程序,在 Metro 应用程序中是否有一种方法可以检测到这一点,使其不等待用户输入?

  2. 是否可以从外部进程访问 Metro 应用程序包中的文件?

编辑 - 一种解决方法是创建一个自定义 Visual Studio 测试运行程序,然后找到一种方法在每次构建时自动运行测试。我知道这可以在 IDE 中完成,但我不确定是否有办法用脚本来做到这一点。

4

3 回答 3

4

我想你早就解决了这个问题,但是为了其他人想要这样做,我让它工作起来没有太多麻烦。为了以自动化/无头方式执行 Metro 应用程序,我编写了一个简单的桌面命令行实用程序,它采用 Metro 应用程序的名称并使用IApplicationActivationManager接口来启动它。然后我可以从脚本中调用该实用程序。

该接口的ActivateApplication方法的第二个参数是传递给激活的应用程序的字符串,有点像命令行参数。它显示为应用程序处理程序接收到的Arguments属性。Visual Studio 模板项目中的默认实现将此值传递给第一次导航到它时,它作为. 你可以在任何一个更方便的地方抓住它。LaunchActivatedEventArgsOnLaunchedOnLaunchedMainPageOnNavigatedToParameterNavigationEventArgs

我的启动器实用程序通过那里传递一个硬编码的标志,以及转发它自己的命令行参数。这允许顶级脚本将任意数据向下传递到 Metro 应用程序。该应用程序可以使用该数据来实现它正在无头运行并运行其测试。它可以将你喜欢的任何类型的结果数据吐到它的一个文件夹中(比如它的LocalFolder),然后桌面应用程序可以从中读取%LOCALAPPDATA%\Packages\APPNAME\LocalState。我将启动器实用程序设置为在启动应用程序后等待结果文件出现,然后使用它们来确定自己的退出代码。启动器实用程序之后无法终止应用程序,但应用程序可以在通过CoreApplication.Exit完成时自行终止。

该设置在一段时间内运行良好,但我现在遇到的一个问题是应用程序并不总是启动到前台,并且运行时将在它不是前台应用程序后暂停/终止应用程序一些时间(目前约 10-15 秒)。因此,任何需要太长时间的测试都不适用于这种方法,除非我还没有发现一些解决方法(当我遇到这个问题时我正在寻找它)。

于 2013-07-25T16:49:28.490 回答
1

我怀疑你能做到。

这与尝试无头运行 WPF 应用程序的问题相同,但更难,因为您还必须处理 Metro 沙盒安全模型。

PS很高兴被证明是错误的!

于 2012-04-18T23:48:24.750 回答
0

不,对不起。您首先需要一个脚本,该脚本首先以“无头”模式运行 Metro 应用程序,但您遇到了困难。你的第二个要求是你的下一面墙。一个应用程序看不到,更不用说监视另一个应用程序/线程/进程。那么你的第三个要求也是不可能的。应用程序内的文件是隔离的。在我看来,你找到了一个很好的桌面应用程序候选人。话虽如此,但不要错误地认为您不能拥有作为仪表板的配套 Metro 应用程序。只是执行核心不能托管在 WinRT 沙箱内。

于 2012-05-22T14:10:02.247 回答