DeploymentItemAttribute Class (Microsoft.VisualStudio.TestTools.UnitTesting)

Switch View :
ScriptFree
API Reference for Testing Tools for Visual Studio ALM
DeploymentItemAttribute Class

Used to specify deployment items such as files or directories for per-test deployment. This class cannot be inherited.

Inheritance Hierarchy

System.Object
  System.Attribute
    Microsoft.VisualStudio.TestTools.UnitTesting.DeploymentItemAttribute

Namespace:  Microsoft.VisualStudio.TestTools.UnitTesting
Assembly:  Microsoft.VisualStudio.QualityTools.UnitTestFramework (in Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll)
Syntax

Visual Basic
<AttributeUsageAttribute(AttributeTargets.Class Or AttributeTargets.Method, AllowMultiple := True)> _
Public NotInheritable Class DeploymentItemAttribute _
	Inherits Attribute
C#
[AttributeUsageAttribute(AttributeTargets.Class|AttributeTargets.Method, AllowMultiple = true)]
public sealed class DeploymentItemAttribute : Attribute
Visual C++
[AttributeUsageAttribute(AttributeTargets::Class|AttributeTargets::Method, AllowMultiple = true)]
public ref class DeploymentItemAttribute sealed : public Attribute
F#
[<Sealed>]
[<AttributeUsageAttribute(AttributeTargets.Class|AttributeTargets.Method, AllowMultiple = true)>]
type DeploymentItemAttribute =  
    class
        inherit Attribute
    end
JScript
public final class DeploymentItemAttribute extends Attribute

The DeploymentItemAttribute type exposes the following members.

Constructors

  Name Description
Public method DeploymentItemAttribute(String) Initializes a new instance of the DeploymentItemAttribute class. An object that is created with this constructor will be initialized with a path to a deployment item or directory.
Public method DeploymentItemAttribute(String, String) Initializes a new instance of the DeploymentItemAttribute class. An object that is created with this constructor will be initialized with a path to a deployment item and an output directory.
Top
Properties

  Name Description
Public property OutputDirectory Gets a value that represents the path to the output directory.
Public property Path Gets a value that represents the path to the deployment item.
Public property TypeId When implemented in a derived class, gets a unique identifier for this Attribute. (Inherited from Attribute.)
Top
Methods

  Name Description
Public method Equals Infrastructure. Returns a value that indicates whether this instance is equal to a specified object. (Inherited from Attribute.)
Protected method Finalize Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection. (Inherited from Object.)
Public method GetHashCode Returns the hash code for this instance. (Inherited from Attribute.)
Public method GetType Gets the Type of the current instance. (Inherited from Object.)
Public method IsDefaultAttribute When overridden in a derived class, indicates whether the value of this instance is the default value for the derived class. (Inherited from Attribute.)
Public method Match When overridden in a derived class, returns a value that indicates whether this instance equals a specified object. (Inherited from Attribute.)
Protected method MemberwiseClone Creates a shallow copy of the current Object. (Inherited from Object.)
Public method ToString Returns a string that represents the current object. (Inherited from Object.)
Top
Explicit Interface Implementations

  Name Description
Explicit interface implemetation Private method _Attribute.GetIDsOfNames Maps a set of names to a corresponding set of dispatch identifiers. (Inherited from Attribute.)
Explicit interface implemetation Private method _Attribute.GetTypeInfo Retrieves the type information for an object, which can be used to get the type information for an interface. (Inherited from Attribute.)
Explicit interface implemetation Private method _Attribute.GetTypeInfoCount Retrieves the number of type information interfaces that an object provides (either 0 or 1). (Inherited from Attribute.)
Explicit interface implemetation Private method _Attribute.Invoke Provides access to properties and methods exposed by an object. (Inherited from Attribute.)
Top
Remarks

Depending on your test settings, Microsoft Visual Studio 2010 runs tests either in the folder in which you have created them or in a separate "deployment" folder. For more information about test settings, see Create Test Settings to Run Automated Tests from Visual Studio.

This section discusses the case in which Microsoft Visual Studio 2010 runs tests in a different folder than the folder that holds the built assemblies.

When a test is run in this manner, the test and code-under-test assemblies, and the deployment items are placed in a test deployment folder unique to that test run. This attribute identifies files and directories that contain files that are used by the deployed test to run. The test engine makes a copy of the deployment items and places them in test deployment directory based on the OutputDirectory specified or the default directory.

This attribute can be specified on a test method or on a test class. However, this attribute is not inherited by derived classes.

There can be multiple instances of this attribute to specify more than one item. The item path can be absolute or relative. Relative paths are relative to the project path.

The following examples demonstrate different usage of the DeploymentItemAttribute:

  • [DeploymentItem("file1.xml")]   Deploys an item named file1.xml located at the project path. The file is deployed to the deployment root directory.

  • [DeploymentItem("file2.xml", "DataFiles")]   Deploys an item named file2.xml located at the project path. The file is deployed to the DataFiles subdirectory of the deployment root directory.

  • [DeploymentItem("C:\\MyDataFiles\\")]   Deploys all items and directories found within the MyDataFiles directory. This does not create the MyDataFiles directory underneath the deployment directory. All files and directories within MyDataFiles will be deployed to the deployment root directory. To copy the entire MyDataFiles directory structure, you must specify MyDataFiles as an output directory.

  • [DeploymentItem("%myDir%\myFile.txt")]   Deploys the file myFile.txt if that file exists in the directory to which %myDir% resolves.

For more information about how to use attributes, see Extending Metadata Using Attributes.

Examples

The following class creates a file that will be used by the test method.

C#
using System;
using System.IO;

namespace CarMaker
{
    public class Car
    {
        private static string make = "myMake";
        private static string model = "myModel";

        public static void CarInfo()
        {
            using (StreamWriter sw = new StreamWriter("testFile1.txt"))
            {
                sw.WriteLine(make);
                sw.WriteLine(model);
            }
        }
    }
}
Visual Basic
Imports System
Imports System.IO

Namespace CarMaker
    Public Class Car

        Private Shared make As String = "myMake"
        Private Shared model As String = "myModel"

        Public Shared Sub CarInfo()
            Dim sw As New StreamWriter("testFile1.txt")
            Try
                sw.WriteLine(make)
                sw.WriteLine(model)
            Finally
                sw.Close()
            End Try
        End Sub
    End Class
End Namespace

The following test class contains a test method that will instantiate the Car class which will create a file that is named "testFile1.txt". This file will be deployed as identified in the DeploymentItemAttribute. Then, the test method will test if the file exists in the same directory as the test assembly.

C#
using System;
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using CarMaker;

namespace DeploymentTest
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod()]
        [DeploymentItem("testFile1.txt")]
        public void ConstructorTest()
        {
            // Create the file to deploy
            Car.CarInfo();
            string file = "testFile1.txt";
            // Check if the created file exists in the deployment directory
            Assert.IsTrue(File.Exists(file), "deployment failed: " + file +
                " did not get deployed");
        }
    }
}
Visual Basic
Imports System
Imports System.IO
Imports Microsoft.VisualStudio.TestTools.UnitTesting
Imports MyVBProject.CarMaker

Namespace DeploymentTest
    <TestClass()> _
    Public Class UnitTest1
        <TestMethod()> _
        <DeploymentItem("testFile1.txt")> _
        Sub ConstructorTest()
            Car.CarInfo()
            Dim file As String = "testFile1.txt"
            Assert.IsTrue(IO.File.Exists(file), "deployment failed: " + file + _
                " did not get deployed")
        End Sub
    End Class
End Namespace
Thread Safety

Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.
See Also

Reference

Community Content

Thomas Lee
Project output path

While the docs say that

[DeploymentItem( @"file.txt" )]

will copy file.txt from the project folder, it is in fact being copied from the project output folder. in other words, you have to make sure that any file you want DeploymentItem to pick up are also copied to the output folder when you're building the test project.


Also, it seems like it looks for the file in different places. if its not found in the project output folder, it appears that it tries to find the file relative to the solution folder


The docs should really be updated to make this more clear



Thomas Lee
Enable Deployment
Also don't forget to enable deployment in the (local) test settings.

Restart VS if you have enabled deployment and it does not take. VS doesn't always detect this change.

DB57D038-5C92-4BF7-81D2-6E5FC4A852C2
DeploymentItem is project relative, but output location is not
If you have the files you need to deploy in a subfolder of your unit test project, you need to specify the project-relative path in the DeploymentItem attribute as such:

[DeploymentItem(@"Foo\Bar\TestFile.txt")]

But when you reference that file within the unit test, the "Foo" and "Bar" folders won't exist in the output directory, so you need to just reference the file as such:

var stream = new FileStream(@"TestFile.txt", FileMode.Open)


G1
Summary
  1. Add your data as files (optionally within folders) in your project directory.
  2. Attribute the file's deployment behavior as, Copy If Newer or Copy
    Always.
  3. Configure your test method to reference the deployed file as
    follows:

const string test_method_datafile = @"SubFolderInProjectDirectory\DataFile.Ext";
[TestMethod, DeploymentItem(test_method_datafile)]
public void test_method()
        {
            var deploymentFolder = Path.GetDirectoryName(this.GetType().Assembly.Location);
            var deployedTestData = Path.Combine(deploymentFolder, test_method_datafile)
            ....
            var data = File.ReadAllText(deployedTestData);
            ....
        }


BigGeek02
Troubleshooting a file that will not deploy
It is helpful to note that if you do not see a file output that you have specified on a test with a DeploymentItem attribute, the *.trx file that is output into the TestResults folder will contain a warning message in Visual Studio 2010, indicating the absolute path where it attempted to get the file from.  This is a quick way to make sure that your understanding of RelativeRoot, Solution folder, etc matches up with Visual Studio's!

J Scott Head
Update Local.TestSettings - Deployment
In order for this to actual do anything, you also have to "Enable deployment" in the local.testsettings (or TraceAndTestImact.testsettings) file.