Partilhar via


Demonstra Passo a passo: Criando um gerador de dados personalizada para um teste de verificação

Você pode usar os geradores de dados padrão para preencher colunas com dados em Visual Studio Team System Database Edition. Se a coluna que você deseja preencher tiver um restrição CHECK definidas nela, os dados com o qual você preenche a coluna devem satisfazer a restrição CHECK.Os geradores de dados padrão podem gerar os dados que satisfaçam várias restrições de verificação.Por exemplo, se você tiver um restrição CHECK que requer que um data está em um determinado intervalo, você pode usar o gerador de DateTime padrão e conjunto as propriedades min e max para satisfazer que restrição CHECK.

No entanto, os geradores de dados padrão não podem satisfazer todas as restrições de verificação.Por exemplo, se um teste de verificação requer que uma data em qualquer um dos dois intervalos distintos, você não poderá usar o gerador de DateTime padrão.Nesta explicação passo a passo, você criar um gerador de dados personalizados que pode satisfazer esse uma restrição.O gerador aceita dois intervalos sistema autônomo entrada e gera uma data aleatória em um desses intervalos.

Observação:

Você pode usar outra abordagem para criar um gerador de dados personalizados e atingir o mesmo meta usando extensibilidade de agregação.Para obter mais informações, consulte Demonstra Passo a passo: Criando um gerador de dados personalizado que agrega geradores padrão.

Nesta explicação passo a passo, você executa as seguintes tarefas:

  • Criar uma classe que herda de Generator.

  • criar Propriedades de entrada para que o usuário pode especificar a data de dois intervalos.

  • criar uma propriedade de saída para usar sistema autônomo a gerador de saída.

  • Substituir o OnInitialize método para propagar a Random objetos e tornar seu gerador de determinista.

  • Substituir o OnGenerateNextValues método para gerar os dados.

  • Assine o gerador de com um nome forte.

Pré-requisitos

Para concluir essa explicação passo a passo, você precisa do seguinte:

  • Database Edition

Criando a classe de gerador de dados personalizado

Para criar a classe do gerador de dados personalizados

  1. In Visual Studio, criar um projeto classe biblioteca no linguagem de sua escolha e denomine GeneratorDateRanges.

  2. No menu Project, escolha Add Reference.

    The Adicionar referência caixa de diálogo é exibida.

  3. clicar no NET guia.No Nome do componente lista, clicar Microsoft.VisualStudio.TeamSystem.dados e, em seguida, clicar OK.

  4. (Opcional, Visual Basic In somente) O gerenciador de soluções, clicar Mostrar todos os arquivos e expandir o nó References para verificar a nova referência.

  5. Na parte superior do Código janela, antes da declaração de classe, adicione a seguinte linha de código:

    Imports Microsoft.VisualStudio.TeamSystem.Data.DataGenerator
    Imports System.Data.SqlTypes
    
    using Microsoft.VisualStudio.TeamSystem.Data.DataGenerator;
    using System.Data.SqlTypes;
    
  6. Renomeie a classe de Class1 para GeneratorDateRangese especificar que a classe herda de Generator.

    Cuidado:

    Por padrão, o nome que você forneça sua classe é o nome que aparece na lista o Gerador coluna a Detalhes da coluna janela.Você deve especificar um nome que não está em conflito com o nome de um gerador de padrão ou de outro gerador personalizado.

    Public Class GeneratorDateRanges
        Inherits Generator
    
    End Class
    
    public class GeneratorDateRanges: Generator
    {
    }
    
  7. No menu File, clique em Save All.

Adicionando propriedades de entrada

Esse gerador de dados personalizados aceita dois intervalos de datas sistema autônomo entrada.Para especificar cada intervalo, o usuário Especifica o mínimo e a data máxima para cada um.Portanto, você deve criar quatro propriedades de entrada no total: duas datas mínimas e duas datas máxima.

Para adicionar as propriedades de entrada

  1. Criar quatro variáveis de membro para Isenção mínimo e máximo datas para a data de dois intervalos.

    Dim range1MinValue As SqlDateTime
    Dim range1MaxValue As SqlDateTime
    
    Dim range2MinValue As SqlDateTime
    Dim range2MaxValue As SqlDateTime
    
    SqlDateTime range1MinValue;
    SqlDateTime range1MaxValue;
    
    SqlDateTime range2MinValue;
    SqlDateTime range2MaxValue;
    
  2. Criar quatro propriedades para conjunto o mínimo e máximo datas para a data de dois intervalos.sistema autônomo propriedades devem ter o InputAttribute para identificá-las sistema autônomo propriedades de entrada.

    <Input(TypeConverter:= GetType(SqlDateTimeConverter))> _
    Public Property Range1Min() As SqlDateTime
        Set(ByVal value As SqlDateTime)
            range1MinValue = value
        End Set
        Get
            Return range1MinValue
        End Get
    End Property
    
    <Input(TypeConverter:= GetType(SqlDateTimeConverter))> _
    Public Property Range1Max() As SqlDateTime
        Set(ByVal value As SqlDateTime)
            range1MaxValue = value
        End Set
        Get
            Return range1MaxValue
        End Get
    End Property
    
    <Input(TypeConverter:= GetType(SqlDateTimeConverter))> _
    Public Property Range2Min() As SqlDateTime
        Set(ByVal value As SqlDateTime)
            range2MinValue = value
        End Set
        Get
            Return range2MinValue
        End Get
    End Property
    
    <Input(TypeConverter:= GetType(SqlDateTimeConverter))> _
    Public Property Range2Max() As SqlDateTime
        Set(ByVal value As SqlDateTime)
            range2MaxValue = value
        End Set
        Get
            Return range2MaxValue
        End Get
    End Property
    
    [Input(TypeConverter = typeof(SqlDateTimeConverter))]
    public SqlDateTime Range1Min
    {
        set {range1MinValue = value;}
        get {return range1MinValue;}
    }
    
    [Input(TypeConverter = typeof(SqlDateTimeConverter))]
    public SqlDateTime Range1Max
    {
        set {range1MaxValue = value;}
        get {return range1MaxValue;}
    }
    
    [Input(TypeConverter = typeof(SqlDateTimeConverter))]
    public SqlDateTime Range2Min
    {
        set {range2MinValue = value;}
        get {return range2MinValue;}
    }
    
    [Input(TypeConverter = typeof(SqlDateTimeConverter))]
    public SqlDateTime Range2Max
    {
        set {range2MaxValue = value;}
        get {return range2MaxValue;}
    }
    
  3. No menu File, clique em Save All.

Adicionando a propriedade de saída

Esse gerador de dados personalizados retorna uma data aleatória sistema autônomo a saída.Portanto, você deve criar uma propriedade de saída.

Para adicionar a propriedade de saída

  1. criar uma variável de membro para data aleatória que é a saída.

    Dim randomDateValue As SqlDateTime
    
    SqlDateTime randomDateValue;
    
  2. Crie uma propriedade para retornar a data aleatória sistema autônomo a saída.A propriedade deve ter o OutputAttribute para identificá-lo sistema autônomo uma propriedade de saída.

    <Output()> _
    Public ReadOnly Property RandomDate() As SqlDateTime
        Get
            Return randomDateValue
        End Get
    End Property
    
    [Output]
    public SqlDateTime RandomDate
    {
        get {return randomDateValue;}
    }
    
  3. No menu File, clique em Save All.

Substituindo o método OnInitialize

Ao gerar dados aleatórios, pode ser determinística ou não-determinística.Dados deterministas repete os mesmos dados sempre que você a gerar de semente mesma.Todos os geradores de dados possuem um Seed propriedade que o usuário pode conjunto. Você pode substituir o OnInitialize método para propagar a Random objetos e tornar seu gerador de determinista.

Para substituir o método OnInitialize

  1. Criar duas variáveis de membro para gerar números aleatórios, sistema autônomo mostrado no exemplo a seguir.Uma variável gera uma data aleatória.A Outros variável escolhe aleatoriamente entre dois intervalos de data possível.

    Dim random As Random
    Dim randomRange As Random
    
    Random random;
    Random randomRange;
    
  2. Substitua o método OnInitialize.

    Protected Overrides Sub OnInitialize(ByVal initInfo As GeneratorInit)
    
        random = New Random(Me.Seed)       'deterministic
        randomRange = New Random(Me.Seed)  'deterministic
    
        'random = New Random()              'non-deterministic
        'randomRange = New Random()         'non-deterministic
    
        MyBase.OnInitialize(initInfo)
    End Sub
    
    protected override void OnInitialize(GeneratorInit initInfo)
    {
        random = new Random(this.Seed);       //deterministic
        randomRange = new Random(this.Seed);  //deterministic
    
        //random = new Random();                //non-deterministic
        //randomRange = new Random();           //non-deterministic
    
        base.OnInitialize(initInfo);
    }
    
  3. No menu File, clique em Save All.

Substituindo o método OnGenerateNextValues

Database Edition chamadas a OnGenerateNextValues método do gerador de criar os dados que ele precisa. Você deve substituir esse método para fornecer a lógica que gera a data aleatória para a propriedade de saída.

Para substituir o método OnGenerateNextValues

  1. Substituir o OnGenerateNextValues método, sistema autônomo mostrado no exemplo a seguir.

    Protected Overrides Sub OnGenerateNextValues()
    
        Dim min As SqlDateTime
        Dim max As SqlDateTime
    
        'Generate a random date from either range 1 or range 2.
        'Randomly select either range 1 or range 2 by randomly 
        'generating an odd or an even random number.
        '------------------------------------------------------------
        If randomRange.Next() Mod 2 = 0 Then  'check for odd or even
            min = range1MinValue
            max = range1MaxValue
        Else
            min = range2MinValue
            max = range2MaxValue
        End If
    
        'The formula for creating a random number in a specific range is:
        'start of range + (size of range * random number between 0 and 1)
    
        'size of range
        Dim range As TimeSpan = max.Value - min.Value
    
        '(size of range * random number between 0 and 1)
        Dim randomNumber As TimeSpan = New TimeSpan(CLng(range.Ticks * random.NextDouble()))
    
        'start of range + (size of range * random number between 0 and 1)
        randomDateValue = min + randomNumber
    
    End Sub
    
    protected override void OnGenerateNextValues()
    {
        SqlDateTime min;
        SqlDateTime max;
    
        //Generate a random date from either range 1 or range 2.
        //Randomly select either range 1 or range 2 by randomly 
        //generating an odd or an even random number.
        //------------------------------------------------------------
        if (randomRange.Next() % 2 == 0)  //check for odd or even
        {
            min = range1MinValue;
            max = range1MaxValue;
        }
        else
        {
            min = range2MinValue;
            max = range2MaxValue;
        }
    
        //The formula for creating a random number in a specific range is:
        //start of range + (size of range * random number between 0 and 1)
    
        //size of range
        TimeSpan range = max.Value - min.Value;
    
        //(size of range * random number between 0 and 1)
        TimeSpan randomNumber = new TimeSpan((long)(range.Ticks * random.NextDouble()));
    
        //start of range + (size of range * random number between 0 and 1)
        randomDateValue = min + randomNumber;
    }
    
  2. No menu File, clique em Save All.

Definindo o conversor de tipo

Para especificar as propriedades de entrada para esse gerador de dados no navegador da propriedade, forneça um conversor de tipo que converte os valores de entrada e para o SqlDateTime Digite.

Para criar a classe do conversor de tipo SqlDateTime

  1. No menu Project clique em Add Class.

    A caixa de diálogo Add New Item aparece.

  2. Em nome, digite SqlDateTimeConverter.

  3. Na parte superior do Código janela, antes da declaração de classe, adicione as seguintes linhas de código:

    Imports System.ComponentModel
    Imports System.Data.SqlTypes
    Imports System.Globalization
    
    using System.ComponentModel;
    using System.Data.SqlTypes;
    using System.Globalization;
    
  4. Renomeie a classe de Class1 para GeneratorDateRangese especificar que a classe herda de TypeConverter.

     [Visual Basic]
    Public Class SqlDateTimeConverter
        Inherits TypeConverter
    
    End Class
    
    public class SqlDateTimeConverter: TypeConverter
    {
    }
    
  5. Dentro da declaração de classe, adicione o construtor da classe.Se você estiver escrevendo o tipo de conversor de classe no Visual Basic, vá para a etapa 6.

    public SqlDateTimeConverter()
    {
    }
    
  6. Após o construtor de classe, adicione um método que verifica se uma conversão específica serão possível por este conversor de tipo.

    Public Overrides Function CanConvertFrom(ByVal context As ITypeDescriptorContext, ByVal sourceType As Type) As Boolean
        Dim result As Boolean
        result = False
        If (sourceType Is GetType(System.String)) Then
            result = True
        Else
            result = MyBase.CanConvertFrom(context, sourceType)
        End If
        Return result
    End Function 
    
    Public Overrides Function CanConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal destinationType As System.Type) As Boolean
        If (destinationType Is GetType(System.String)) Then
            Return True
        End If
        Return MyBase.CanConvertTo(context, destinationType)
    End Function
    
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        bool result = false;
        if (sourceType == typeof(string))
        {
            result = true;
        }
        else
        {
            result = base.CanConvertFrom(context, sourceType);
        }
        return result;
    }
    
    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
        if (destinationType == typeof(string))
        {
            return true;
        }
        return base.CanConvertTo(context, destinationType);
    }
    
  7. Por fim, adicione os métodos de conversor.

    Public Overrides Function ConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object) As Object
        Dim dateTimeString As String
        dateTimeString = value.ToString
        If (dateTimeString.Length > 0) Then
            Dim dateTime As Date
            dateTime = Date.Parse(dateTimeString, culture)
            Return New SqlDateTime(dateTime)
        End If
        Return MyBase.ConvertFrom(context, culture, value)
    End Function
    
    Public Overrides Function ConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object, ByVal destinationType As System.Type) As Object
        If (destinationType Is GetType(System.String)) Then
            Dim dateTime As Date
            dateTime = CType(value, SqlDateTime).Value
            dateTime.ToString(culture)
        End If
        Return MyBase.ConvertTo(context, culture, value, destinationType)
    End Function 
    
            public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
            {
                string dateTimeString = value as string;
                if (dateTimeString != null)
                {
                    DateTime dateTime = DateTime.Parse(dateTimeString, culture);
                    return new SqlDateTime(dateTime);
                }
                return base.ConvertFrom(context, culture, value);
            }
    
            public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
            {
                if (destinationType == typeof(string))
                {
                    DateTime dateTime = ((SqlDateTime)value).Value;
                    dateTime.ToString(culture);
                }
                return base.ConvertTo(context, culture, value, destinationType);
            }
    
  8. No menu File, clique em Save All.

O gerador de assinatura

Todos os geradores de dados personalizados devem ser assinados com um nome forte antes que eles são registrados.

Para assinar o gerador de com um nome forte

  1. Sobre o Projeto menu, clicar Propriedades GeneratorDateRanges para em em aberto as propriedades do projeto.

  2. Sobre o Assinatura guia, selecionar o Assinar o assembly a caixa de seleção.

  3. No escolher um arquivo de chave de nome forte clicar**<New...>**.

  4. No nome de arquivo de chave caixa, digite GeneratorDateRangesKey, digite e confirme uma senha e, em seguida, clicar OK.

    Quando você constrói sua solução, o arquivo de chave é usado para assinar o assembly.

  5. No menu File, clique em Save All.

  6. On the Compilação menu, clicar Criar solução.

    O gerador de dados foi criado agora.Em seguida você deve registrá-lo em seu computador para que você pode usá-lo nos planos de geração de dados.

Segurança

Para obter mais informações, consulte Segurança dos geradores de dados.

Próximas etapas

Agora que você criou seu gerador de dados, você deve registrá-lo em seu computador.Para obter mais informações, consulte o seguinte:

Consulte também

Tarefas

Demonstra Passo a passo: Implantando um gerador de dados personalizados

Conceitos

Visão geral da extensibilidade do gerador de dados

Referência

Microsoft.VisualStudio.TeamSystem.Data.DataGenerator

Outros recursos

Criando geradores de dados personalizados

Usando os geradores de dados padrão

Explicações passo a passo de gerador de dados