Yêu cầu:
Kiểm tra Python:
python -V
Cài đặt Netmiko và Pytest
python -m pip install netmiko pytest ntc_templates
Cấu hình IP và VLAN
from netmiko import ConnectHandler
sw={
'device_type':"cisco_ios",
'ip':'10.215.27.27',
'username':'vnpro',
'password':'vnpro#123',
'secret':'vnpro#321'
}
sw_connect= ConnectHandler(**sw)
sw_connect.enable()
setip=['int e0/2','no sw','ip add 192.168.23.1 255.255.255.0','no shut']
sw_connect.send_config_set(setip)
for i in range(20,31):
createvlan=['vlan {}'.format(i)]
configvlan=['int vlan {}'.format(i), 'ip add 172.16.{}.1 255.255.255.0'.format(i),'no shut']
sw_connect.send_config_set(createvlan)
sw_connect.send_config_set(configvlan)
Kiểm tra kết quả
Sử dụng Unittest
Để Unitest tự động xác định file python test, cần đặt tên theo cú pháp “test_*.py” (Dấu * có thay thế bằng bất kỳ ký tự được phép nào trong quy ước đặt tên)
Chạy test từ modules hoặc class
python -m unittest modules
Nếu không đặt tên theo cú pháp cần chỉ định file cho Unitest
python -m unittest somethings.py
Viết file Python test kiểm tra địa chỉ IP và VLAN 20-30 cấu hình bên trên đã thành công hay chưa?
Sử dụng thư viện và module cần thiết: unittest, netmiko,ntc_templates
import unittest
from netmiko import ConnectHandler
from ntc_templates.parse import parse_output
Khai báo class chứa testcas sử dụng giá trị truyền vào unittest.TesCase chứa các chức năng sau:
@classmethod
def setUpClass(cls):
sw={
'device_type':"cisco_ios",
'ip':'10.215.27.27',
'username':'vnpro',
'password':'vnpro#123',
'secret':'vnpro#321'
}
sw_connect= ConnectHandler(**sw)
sw_connect.enable()
print("start test")
cls.sw_connect=sw_connect
@classmethod
def tearDownClass(cls) -> None:
cls.sw_connect.disconnect()
Trong Python @classmethod được sử dụng để khai báo một phương thức của Class, tham số đâu tiên của hàm này phải là cls
Hàm setUpClass (lưu ý phải đặt tên đúng syntax) sẽ thực hiện đầu tiên, trước tất cả các testcase.
Hàm tearDownClass(lưu ý phải đặt tên đúng syntax) sẽ thực hiện cuối cùng, sau tất cả các testcase.
data=self.sw_connect.send_command('show ip int br')
data_parse=parse_output(platform="cisco_ios",comma nd="show ip interface brief",data=data)
self.assertEqual(data_parse[2]['ipaddr'],'192.168.23.1')
assertEqual sẽ kiểm tra IP của E0/2 có phải là ‘192.168.23.1’
data=self.sw_connect.send_command("show vlan")
data_parse=parse_output(platform="cisco_ios",comma nd="show vlan",data=data)
vlanid=[]
for i in range(len(data_parse)):
vlanid+=[data_parse[i]['vlan_id']]
for i in range(20,31):
self.assertIn(str(i),vlanid)
Testcase này sẽ thu tập tất cả các vlan_id hiện đang được cấu hình trên thiết bị lưu thành list.
assertIn sẽ kiểm tra vlan_id có trong danh sách này hay không.
File test_configsw.py
import unittest
from netmiko import ConnectHandler
from ntc_templates.parse import parse_output
class Testconfig(unittest.TestCase):
@classmethod
def setUpClass(cls):
sw={
'device_type':"cisco_ios",
'ip':'10.215.27.27',
'username':'vnpro',
'password':'vnpro#123',
'secret':'vnpro#321'
}
sw_connect= ConnectHandler(**sw)
sw_connect.enable()
print("start test")
cls.sw_connect=sw_connect
@classmethod
def tearDownClass(cls) -> None:
cls.sw_connect.disconnect()
def test_ip(self):
data=self.sw_connect.send_command('show ip int br')
data_parse=parse_output(platform="cisco_ios",comma nd="show ip interface brief",data=data)
self.assertEqual(data_parse[2]['ipaddr'],'192.168.23.1')
def test_vlan(self):
data=self.sw_connect.send_command("show vlan")
data_parse=parse_output(platform="cisco_ios",comma nd="show vlan",data=data)
vlanid=[]
for i in range(len(data_parse)):
vlanid+=[data_parse[i]['vlan_id']]
for i in range(20,31):
self.assertIn(str(i),vlanid)
if __name__=='__main__':
unittest.main()
python -m unittest .\test_configsw.py
Với 2 cách trên ta sẽ chạy toàn bộ test trong file. Để chạy test kiểm tra kèm điều kiện chỉ 1 vài test có tên file hoặc tên test chỉ định ta chọn option -k
python -m unittest -k ip # chạy test có ký tự ip
Với File test bên trên ta có 1 testcase ứng với ký tự ip
Để xem chi tiết testcase nào được chạy ta chọn option -v
python -m unittest -v
Tham khảo:
https://docs.python.org/3/library/unittest.html
https://realpython.com/python-testing/
https://github.com/networktocode/ntc-templates
- Sử dụng Netmiko cấu hình IP 192.168.23.1 cho interface e0/2.
- Sử dụng Netmiko cấu hình Vlan 20-30.
- Sử dụng PyTest kiểm tra cấu hình trên thiết bị.
- Cài đặt Python 3
- Cài đặt Netmiko
- Cài đặt NTC_templates
- Cài đặt Pytest
Kiểm tra Python:
python -V
Cài đặt Netmiko và Pytest
python -m pip install netmiko pytest ntc_templates
Cấu hình IP và VLAN
from netmiko import ConnectHandler
sw={
'device_type':"cisco_ios",
'ip':'10.215.27.27',
'username':'vnpro',
'password':'vnpro#123',
'secret':'vnpro#321'
}
sw_connect= ConnectHandler(**sw)
sw_connect.enable()
setip=['int e0/2','no sw','ip add 192.168.23.1 255.255.255.0','no shut']
sw_connect.send_config_set(setip)
for i in range(20,31):
createvlan=['vlan {}'.format(i)]
configvlan=['int vlan {}'.format(i), 'ip add 172.16.{}.1 255.255.255.0'.format(i),'no shut']
sw_connect.send_config_set(createvlan)
sw_connect.send_config_set(configvlan)
Kiểm tra kết quả
Sử dụng Unittest
Để Unitest tự động xác định file python test, cần đặt tên theo cú pháp “test_*.py” (Dấu * có thay thế bằng bất kỳ ký tự được phép nào trong quy ước đặt tên)
Chạy test từ modules hoặc class
python -m unittest modules
Nếu không đặt tên theo cú pháp cần chỉ định file cho Unitest
python -m unittest somethings.py
Viết file Python test kiểm tra địa chỉ IP và VLAN 20-30 cấu hình bên trên đã thành công hay chưa?
Sử dụng thư viện và module cần thiết: unittest, netmiko,ntc_templates
import unittest
from netmiko import ConnectHandler
from ntc_templates.parse import parse_output
Khai báo class chứa testcas sử dụng giá trị truyền vào unittest.TesCase chứa các chức năng sau:
- Khởi tạo kết nối SSH
- Kiểm tra IP đã được cấu hình hay chưa.
- Kiểm tra VLAN đã được cấu hinh hay chưa.
- Ngắt kết nố SSH khi tất cả các test thực thi xong.
@classmethod
def setUpClass(cls):
sw={
'device_type':"cisco_ios",
'ip':'10.215.27.27',
'username':'vnpro',
'password':'vnpro#123',
'secret':'vnpro#321'
}
sw_connect= ConnectHandler(**sw)
sw_connect.enable()
print("start test")
cls.sw_connect=sw_connect
@classmethod
def tearDownClass(cls) -> None:
cls.sw_connect.disconnect()
Trong Python @classmethod được sử dụng để khai báo một phương thức của Class, tham số đâu tiên của hàm này phải là cls
Hàm setUpClass (lưu ý phải đặt tên đúng syntax) sẽ thực hiện đầu tiên, trước tất cả các testcase.
Hàm tearDownClass(lưu ý phải đặt tên đúng syntax) sẽ thực hiện cuối cùng, sau tất cả các testcase.
- TestCase IP
data=self.sw_connect.send_command('show ip int br')
data_parse=parse_output(platform="cisco_ios",comma nd="show ip interface brief",data=data)
self.assertEqual(data_parse[2]['ipaddr'],'192.168.23.1')
assertEqual sẽ kiểm tra IP của E0/2 có phải là ‘192.168.23.1’
- TestCase VLAN:
data=self.sw_connect.send_command("show vlan")
data_parse=parse_output(platform="cisco_ios",comma nd="show vlan",data=data)
vlanid=[]
for i in range(len(data_parse)):
vlanid+=[data_parse[i]['vlan_id']]
for i in range(20,31):
self.assertIn(str(i),vlanid)
Testcase này sẽ thu tập tất cả các vlan_id hiện đang được cấu hình trên thiết bị lưu thành list.
assertIn sẽ kiểm tra vlan_id có trong danh sách này hay không.
File test_configsw.py
import unittest
from netmiko import ConnectHandler
from ntc_templates.parse import parse_output
class Testconfig(unittest.TestCase):
@classmethod
def setUpClass(cls):
sw={
'device_type':"cisco_ios",
'ip':'10.215.27.27',
'username':'vnpro',
'password':'vnpro#123',
'secret':'vnpro#321'
}
sw_connect= ConnectHandler(**sw)
sw_connect.enable()
print("start test")
cls.sw_connect=sw_connect
@classmethod
def tearDownClass(cls) -> None:
cls.sw_connect.disconnect()
def test_ip(self):
data=self.sw_connect.send_command('show ip int br')
data_parse=parse_output(platform="cisco_ios",comma nd="show ip interface brief",data=data)
self.assertEqual(data_parse[2]['ipaddr'],'192.168.23.1')
def test_vlan(self):
data=self.sw_connect.send_command("show vlan")
data_parse=parse_output(platform="cisco_ios",comma nd="show vlan",data=data)
vlanid=[]
for i in range(len(data_parse)):
vlanid+=[data_parse[i]['vlan_id']]
for i in range(20,31):
self.assertIn(str(i),vlanid)
if __name__=='__main__':
unittest.main()
- Chạy file test để kiểm tra
python -m unittest .\test_configsw.py
Với 2 cách trên ta sẽ chạy toàn bộ test trong file. Để chạy test kiểm tra kèm điều kiện chỉ 1 vài test có tên file hoặc tên test chỉ định ta chọn option -k
python -m unittest -k ip # chạy test có ký tự ip
Với File test bên trên ta có 1 testcase ứng với ký tự ip
Để xem chi tiết testcase nào được chạy ta chọn option -v
python -m unittest -v
Tham khảo:
https://docs.python.org/3/library/unittest.html
https://realpython.com/python-testing/
https://github.com/networktocode/ntc-templates