Exemplo n.º 1
0
        /// <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]);
            }
        }
Exemplo n.º 2
0
        /// <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);
        }