/// <summary> /// Distributes tests to a set of distribution keys that were previously /// registered via RegisterKey. The distribution directory specified for /// RegisterKey and Distribute must match. /// </summary> /// <param name="records">Tests to distribute.</param> /// <param name="distributionDirectory">Directory under which tests will be distributed.</param> /// <param name="strategyPrefix">Prefix of strategy to distribute the tests.</param> /// <param name="testBinariesDirectory">Location of test binaries.</param> public static void Distribute(TestRecords records, DirectoryInfo distributionDirectory, string strategyPrefix, DirectoryInfo testBinariesDirectory) { // Directory name == distribution key DirectoryInfo[] subdirectories = distributionDirectory.GetDirectories(); MachineRecord[] machines = subdirectories.Select(directory => (MachineRecord)ObjectSerializer.Deserialize(new XmlTextReader(Path.Combine(directory.FullName, "MachineRecord.xml")), typeof(MachineRecord), null)).ToArray(); int subdirectoriesCount = subdirectories.Length; if (subdirectoriesCount == 0) { throw new ApplicationException("You should execute RegisterForDistribution before DiscoverAndDistribute."); } if (records.ExecutionGroupRecords.Count > 0) { throw new ApplicationException("Execution Group Records are already populated - tests appear to already have run."); } List <TestRecords> partitionedTests = null; DistributionStrategy strategy = DistributionStrategy.CreateDistributionStrategy(strategyPrefix); partitionedTests = strategy.PartitionTests(records, machines, testBinariesDirectory); for (int i = 0; i < subdirectoriesCount; i++) { // Save each subset of tests to a directory for each registered key. partitionedTests[i].Save(subdirectories[i]); } }
/// <summary> /// Create a DistributionStrategy based on the prefix. /// </summary> /// <param name="strategyPrefix">Prefix of the DistributionStrategy</param> /// <returns>DistributionStrategy created</returns> public static DistributionStrategy CreateDistributionStrategy(string strategyPrefix) { if (String.IsNullOrEmpty(strategyPrefix)) { strategyPrefix = "Functional"; } // Assume that Strategy is defined in the same namespace and assembly with DistributionStrategy, // and named as stategyPrefix + "DistributionStrategy". string strategyTypeName = strategyPrefix + "DistributionStrategy"; strategyTypeName = String.Format("{0}.{1}", typeof(DistributionStrategy).Namespace, strategyTypeName); Assembly strategyAssembly = Assembly.GetAssembly(typeof(DistributionStrategy)); Type strategyType = strategyAssembly.GetType(strategyTypeName); if (strategyType == null) { throw new NotSupportedException(String.Format("Type: {0} not found in assembly {1}.", strategyTypeName, strategyAssembly.FullName)); } DistributionStrategy strategy = (DistributionStrategy)Activator.CreateInstance(strategyType); return(strategy); }