Forwarded from ΠΠ½ΠΈΠ³ΠΈ Π΄Π»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠΎΠ²
ββPython Unit Test Automation (2017)
ΠΠ²ΡΠΎΡ: Ashwin Pajankar
#python #book #english #advanced
Π―Π·ΡΠΊ: Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ.
Π¦Π΅Π»Π΅Π²Π°Ρ Π°ΡΠ΄ΠΈΡΠΎΡΠΈΡ: ΠΎΠΏΡΡΠ½ΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ.
Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅βββΡΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π½Π° ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΠ°ΡΡΠΈ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π Π½Π°ΡΡΠΎΡΡΠ΅ΠΌ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π΅ Π²Ρ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΠ΅ΡΡ Ρ ΡΠ½ΠΈΡ-ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π΄Π»Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² Π½Π° ΡΠ·ΡΠΊΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Python Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΠ°ΠΊΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ, ΠΊΠ°ΠΊ doctest, unittest, nose, nose2 ΠΈ pytest. ΠΡ ΡΠ·Π½Π°Π΅ΡΠ΅ ΠΎ Π²Π°ΠΆΠ½ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡΡ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΠΈ ΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π° Python 3, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ·Π½Π°Π΅ΡΠ΅ ΡΠ°Π·Π½ΠΈΡΡ ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΡ ΡΠ΅ΡΡΠΎΠ² Π΄Π»Ρ Python 2 ΠΈ 3.
Π ΠΊΠ½ΠΈΠ³Π΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ΅ΠΌΡ:
β Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Python;
β ΡΠ½ΠΈΡ-ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅;
β Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΡΡΠΎΠ²;
β ΠΎΠ±Π·ΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ nose ΠΈ nose2;
β ΠΏΡΠΈΠ½Ρ TDD ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄ΡΡΠ³ΠΎΠ΅.
ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°:
β Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΎΠ±ΡΡΠΌ;
βΠ°ΠΊΡΡΠ°Π»ΡΠ½ΡΠΉ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»;
β ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΡ ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΊΠΎΠ΄Π°;
β ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΠΌ.
ΠΠ΅Π΄ΠΎΡΡΠ°ΡΠΊΠΈ:
β Π½Π΅ Π·Π°ΠΌΠ΅ΡΠ΅Π½ΠΎ.
ΠΠ²ΡΠΎΡ: Ashwin Pajankar
#python #book #english #advanced
Π―Π·ΡΠΊ: Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ.
Π¦Π΅Π»Π΅Π²Π°Ρ Π°ΡΠ΄ΠΈΡΠΎΡΠΈΡ: ΠΎΠΏΡΡΠ½ΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ.
Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅βββΡΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π½Π° ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΠ°ΡΡΠΈ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π Π½Π°ΡΡΠΎΡΡΠ΅ΠΌ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π΅ Π²Ρ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΠ΅ΡΡ Ρ ΡΠ½ΠΈΡ-ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π΄Π»Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² Π½Π° ΡΠ·ΡΠΊΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Python Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΠ°ΠΊΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ, ΠΊΠ°ΠΊ doctest, unittest, nose, nose2 ΠΈ pytest. ΠΡ ΡΠ·Π½Π°Π΅ΡΠ΅ ΠΎ Π²Π°ΠΆΠ½ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡΡ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΠΈ ΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π° Python 3, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ·Π½Π°Π΅ΡΠ΅ ΡΠ°Π·Π½ΠΈΡΡ ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΡ ΡΠ΅ΡΡΠΎΠ² Π΄Π»Ρ Python 2 ΠΈ 3.
Π ΠΊΠ½ΠΈΠ³Π΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ΅ΠΌΡ:
β Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Python;
β ΡΠ½ΠΈΡ-ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅;
β Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΡΡΠΎΠ²;
β ΠΎΠ±Π·ΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ nose ΠΈ nose2;
β ΠΏΡΠΈΠ½Ρ TDD ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄ΡΡΠ³ΠΎΠ΅.
ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°:
β Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΎΠ±ΡΡΠΌ;
βΠ°ΠΊΡΡΠ°Π»ΡΠ½ΡΠΉ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»;
β ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΡ ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΊΠΎΠ΄Π°;
β ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΠΌ.
ΠΠ΅Π΄ΠΎΡΡΠ°ΡΠΊΠΈ:
β Π½Π΅ Π·Π°ΠΌΠ΅ΡΠ΅Π½ΠΎ.
private void SendMessage(string phoneNum, string messageText)
{
var service = new SMSGateClient();
service.ClientCredentials.UserName.UserName = "smsgateuser";
service.ClientCredentials.UserName.Password = "SmsGate20Raz";
var auth = new AuthData() { Login = "StartSMS", Password = "SmsSmsSms30Raz" };
var nums = phoneNum.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries);
//var ident = service.SendMessage(auth, phoneNum.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries), messageText);
foreach (var num in nums)
{
try
{
var ident = service.SendMessage(auth, new[] { num }, StringSplitOptions.RemoveEmptyEntries), messageText);
LogMessage(phoneNum, messageText, ident.FirstOrDefault()?.MessageID > 0 ? "ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΎ" : "ΠΡΠΈΠ±ΠΊΠ°");
}
catch (Exception e)
{
MessageBox.Show($"{num}\r\n{e.Message}");
}
}
}
{
var service = new SMSGateClient();
service.ClientCredentials.UserName.UserName = "smsgateuser";
service.ClientCredentials.UserName.Password = "SmsGate20Raz";
var auth = new AuthData() { Login = "StartSMS", Password = "SmsSmsSms30Raz" };
var nums = phoneNum.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries);
//var ident = service.SendMessage(auth, phoneNum.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries), messageText);
foreach (var num in nums)
{
try
{
var ident = service.SendMessage(auth, new[] { num }, StringSplitOptions.RemoveEmptyEntries), messageText);
LogMessage(phoneNum, messageText, ident.FirstOrDefault()?.MessageID > 0 ? "ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΎ" : "ΠΡΠΈΠ±ΠΊΠ°");
}
catch (Exception e)
{
MessageBox.Show($"{num}\r\n{e.Message}");
}
}
}
ΠΠ°ΠΏΠΈΡΠ°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Β«ΠΠΈΡΠ»ΠΈΡΡΒ» Ρ ΠΏΠΎΠ»ΡΠΌΠΈ: Π½Π°Π·Π²Π°Π½ΠΈΠ΅, ΡΠ΅Π½Π°, ΡΡΡΠ»ΠΊΠ° Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ Ρ ΠΏΠΎΠΊΡΠΏΠΊΠΎΠΉ, ΠΏΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π»ΡΠ±ΠΎΠ΅ Π΄ΡΡΠ³ΠΎΠ΅ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΎΠ΅ CRUD-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠ²ΠΎΠΉ Π²ΠΊΡΡ. Π’ΡΠ΅Π±ΡΠ΅ΠΌΡΠ΅ ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ: MySQL, Python + PyQT. ΠΡΠ»ΠΎΠΆΠΈΡΡ Π½Π° GitHub. ΠΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ: 2-4 ΡΠ°ΡΠ°.
ΠΠ°Π»ΡΠ½Π΅ΠΉΡΠ°Ρ ΠΊΠΎΠΌΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡ
Π‘ΡΡΠ»ΠΊΡ Π½Π° GitHub Ρ ΡΠ΅ΡΡΠΎΠ²ΡΠΌ Π·Π°Π΄Π°Π½ΠΈΠ΅ΠΌ ΠΏΡΠΈΡΡΠ»Π°ΠΉΡΠ΅ Π½Π° skkachaev Π² telegram/gmail/Π’ΠΠΠΠ Π²ΠΌΠ΅ΡΡΠ΅ ΡΠΎ ΡΡΡΠ»ΠΊΠΎΠΉ Π½Π° ΡΠ΅Π·ΡΠΌΠ΅.
ΠΠ°Π»ΡΠ½Π΅ΠΉΡΠ°Ρ ΠΊΠΎΠΌΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡ
Π‘ΡΡΠ»ΠΊΡ Π½Π° GitHub Ρ ΡΠ΅ΡΡΠΎΠ²ΡΠΌ Π·Π°Π΄Π°Π½ΠΈΠ΅ΠΌ ΠΏΡΠΈΡΡΠ»Π°ΠΉΡΠ΅ Π½Π° skkachaev Π² telegram/gmail/Π’ΠΠΠΠ Π²ΠΌΠ΅ΡΡΠ΅ ΡΠΎ ΡΡΡΠ»ΠΊΠΎΠΉ Π½Π° ΡΠ΅Π·ΡΠΌΠ΅.
Π ΡΠ°ΠΉΠ»Π΅ pom.xml Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ²ΡΡΠΈΡΡ Π²Π΅ΡΡΠΈΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ 5.0 -> 6.0 ΠΈ 1.4 -> 1.5
Π‘Π΄Π΅Π»Π°ΠΉ ΡΡΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Bash
...
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.0</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>1.4</version>
</plugin>
...
Π‘Π΄Π΅Π»Π°ΠΉ ΡΡΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Bash
...
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.0</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>1.4</version>
</plugin>
...