我有一个测试,我想确保一页内的单独操作会产生不同的结果。具体来说,我有几种方法可以在页面上进行排序,并且我想要进行测试以确保每种排序都不同。我还有其他测试来确保每种类型的正确性。
我希望这次对话的重点是并行运行测试操作并在最后比较结果的好方法,而不是测试什么或测试方法。我认为测试中的并行操作是一个有趣且足够广泛的主题,它可能对其他人有用。
让“generateHashFromSearchResults()”是一个函数,它返回一个字符串,表示当前 IE 实例上显示的搜索结果的顺序。以下是使用一个浏览器实例以序列化方式运行的代码:
var set = new HashSet<string>();
var sortOptions = new List<String>() { "sort1", "sort2", "sort3" };
// Default sort
set.Add(generateHashFromSearchResults());
sortOptions.ForEach(s => {
ie.Link(Find.ByText(s)).Click();
set.Add(generateHashFromSearchResults());
});
Assert.That(set.Count() == 4);
几个月前我读过 PLINQ 并认为这可能是一个不错的用例。现在让“generateHashFromSearchResults(IE ie)”成为同一个函数,但它在明确定义的 IE 实例上运行。我试过这样的事情:
List<string> resultList = sortOptions.AsParallel().Select(s => {
var ie = new IE(true);
ie.Link(Find.ByText(s)).Click();
return generateHashFromSearchResults(ie);
}).ToList();
// Forget about default sort for now. There should be 3 distinct results
Assert.That(new HashSet<string>(resultList).Count() == 3);
我现在面临的最大问题是不了解 PLINQ 如何进行线程管理。WatiN 需要在单元状态设置为单线程 (STAThread) 的情况下运行。我知道每个 IE 实例都应该在它自己的线程中,但是将 PLINQ 查询中的每个线程设置为正确的单元状态并不能解决问题。
我开始怀疑我需要了解更多关于 PLINQ 的信息才能继续,或者我需要手动学习更多关于线程管理的信息才能让它工作。
有什么想法吗?