SetTestUser.cs
8.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.VisualStudio.TestTools.LoadTesting;
using System.ComponentModel;
using System.IO;
using System.Collections.Specialized;
namespace PluginLib
{
[DisplayName("Set Parameter In Context")]
[Description("Sätter en parameter i testcontextet för alla eller vissa tester i mixen hämtat från en CSV fil")]
public class SetTestUser : ILoadTestPlugin
{
// Summary:
// Initializes the load test plug-in.
//
// Parameters:
// loadTest:
// The load test to be executed.
private string myConnectionString;
private string myLogFileString;
private string myParameterName;
private string myTestNames;
private bool myUseRandom = true;
private bool myUseUnique = false;
private bool myUseUniqueIteration = false;
private bool myLogToFile = false;
private bool mySeqLoop = false;
private StringCollection myParams = new StringCollection();
private Random random = new Random();
private LoadTest m_loadTest;
[DisplayName("Endast dessa Tester")]
[Description("Ange de tester som ska få denna parameter. Lämna blankt för alla tester. Testets namn måste annars finnas i denna sträng för att få parametervärdet.")]
[DefaultValue("")]
public string Test_Names
{
get { return myTestNames; }
set { myTestNames = value.ToLower(); }
}
[DisplayName("Sökväg till CSV fil")]
[Description("Ange den fullständiga sökvägen till CSV filen. Observera att filen behöver finnas på alla agenterna också om du inte kör lokalt.")]
[DefaultValue("C:\\Userdata.csv")]
public string Connection_String
{
get { return myConnectionString; }
set { myConnectionString = value; }
}
[DisplayName("Context Parameter Namn")]
[Description("Ange namnet på parametern som vi ska lägga till i TestContext")]
[DefaultValue("UserName")]
public string Parameter_Name
{
get { return myParameterName; }
set { myParameterName = value; }
}
[DisplayName("Logga fungerande till")]
[Description("Ange den fullständiga sökvägen till logg filen. Om filen finns kommer den inte skrivas över utan läggas till i slutet.")]
[DefaultValue("C:\\Temp\\Fungerande.log")]
[CategoryAttribute("Loggning")]
public string LogFilePathString
{
get { return myLogFileString; }
set { myLogFileString = value; }
}
[DisplayName("Välj slumpmässigt?")]
[Description("Ange True om du vill välja en slumpmässig användare. False går igenom listan sekventiellt.")]
[DefaultValue(true)]
public bool Use_Random
{
get { return myUseRandom; }
set { myUseRandom = value; }
}
[DisplayName("Välj unikt per VU?")]
[Description("Ange True om du vill att varje LoadTest VU ska ha sitt eget unika värde och återanvända detta i varje iteration. Stänger av slumpmässigt val.")]
[DefaultValue(false)]
public bool Use_Unique
{
get { return myUseUnique; }
set { myUseUnique = value; }
}
[DisplayName("Välj unikt per Iteration?")]
[Description("Ange True om du vill att varje LoadTest VU ska ha sitt eget unika värde för varje iteration, dvs aldrig återanvändas av någon under testet.")]
[DefaultValue(false)]
public bool Use_UniqueIteration
{
get { return myUseUniqueIteration; }
set { myUseUniqueIteration = value; }
}
[DisplayName("Välj sekventiell loop?")]
[Description("Ange true om du vill börja om från början om sekventiell läsning får slut på värden. Gäller även Unik läsning.")]
[DefaultValue(false)]
public bool Use_Loop
{
get { return mySeqLoop; }
set { mySeqLoop = value; }
}
[DisplayName("Logga fungerande till fil?")]
[Description("Ange True om du vill att poster vars tester slutar i Pass ska loggas till fil (c:\\fungerande.log). Om filen redan finns läggs de till i slutet.")]
[DefaultValue(false)]
[CategoryAttribute("Loggning")]
public bool Log_To_File
{
get { return myLogToFile; }
set { myLogToFile = value; }
}
public void Initialize(LoadTest loadTest)
{
// Vi bör läsa in alla värden här
this.initUserArray(myConnectionString);
if (myParams.Count > 0)
{
m_loadTest = loadTest;
if (myUseUniqueIteration)
m_loadTest.TestStarting += new EventHandler<TestStartingEventArgs>(loadTestStartingUniqueIteration);
else if(myUseUnique)
m_loadTest.TestStarting += new EventHandler<TestStartingEventArgs>(loadTestStartingUnique);
else if (myUseRandom)
m_loadTest.TestStarting += new EventHandler<TestStartingEventArgs>(loadTestStartingRandom);
else
m_loadTest.TestStarting += new EventHandler<TestStartingEventArgs>(loadTestStartingSeq);
}
if (myLogToFile)
{
m_loadTest.TestFinished += new EventHandler<TestFinishedEventArgs>(loadTestEndLogger);
}
}
void loadTestEndLogger(object sender, TestFinishedEventArgs e)
{
// Log the user to logfile if the test is passed
if (e.Result.Passed)
{
File.AppendAllText(myLogFileString, e.UserContext[myParameterName].ToString() + "\r\n");
}
}
void loadTestStartingRandom(object sender, TestStartingEventArgs e)
{
// Check that its the right script
if (myTestNames.Length > 0 && !myTestNames.Contains(e.TestName.ToLower())) return;
// Add a context parameter to the starting test
string user = this.getRandomUser();
e.TestContextProperties.Add(myParameterName, user);
e.UserContext[myParameterName] = user;
}
void loadTestStartingSeq(object sender, TestStartingEventArgs e)
{
// Check that its the right script
if (myTestNames.Length > 0 && !myTestNames.Contains(e.TestName.ToLower())) return;
// Add a context parameter to the starting test
string user = this.getSeqUser(e.UserContext.CompletedTestCount);
e.TestContextProperties.Add(myParameterName, user);
e.UserContext[myParameterName] = user;
}
void loadTestStartingUnique(object sender, TestStartingEventArgs e)
{
// Check that its the right script
if (myTestNames.Length > 0 && !myTestNames.Contains(e.TestName.ToLower())) return;
// Add a context parameter to the starting test
string user = this.getSeqUser(e.UserContext.UserId);
e.TestContextProperties.Add(myParameterName, user);
e.UserContext[myParameterName] = user;
}
void loadTestStartingUniqueIteration(object sender, TestStartingEventArgs e)
{
// Check that its the right script
if (myTestNames.Length > 0 && !myTestNames.Contains(e.TestName.ToLower())) return;
// Add a context parameter to the starting test
string user = this.getSeqUser(e.TestIterationNumber - 1);
e.TestContextProperties.Add(myParameterName, user);
e.UserContext[myParameterName] = user;
}
string getRandomUser()
{
int randomIndex = random.Next(myParams.Count - 1);
return myParams[randomIndex];
}
string getSeqUser(int seqIndex)
{
if (seqIndex < myParams.Count)
return myParams[seqIndex];
else
{
if (mySeqLoop)
return myParams[seqIndex % myParams.Count];
else
return myParams[myParams.Count - 1];
}
}
bool initUserArray(string path)
{
if (path.Length > 0)
{
StreamReader re = File.OpenText(path);
string input = null;
while ((input = re.ReadLine()) != null)
{
myParams.Add(input);
}
re.Close();
return true;
}
else return false;
}
}
}