diff --git a/test/e2e/vrfstest/vrf_test.go b/test/e2e/vrfstest/vrf_test.go
new file mode 100644
index 00000000..77bfe9c8
--- /dev/null
+++ b/test/e2e/vrfstest/vrf_test.go
@@ -0,0 +1,234 @@
+package vrfstest
+
+import (
+	"io"
+	"os"
+	"strings"
+	"testing"
+
+	root "github.com/equinix/metal-cli/internal/cli"
+	outputPkg "github.com/equinix/metal-cli/internal/outputs"
+	"github.com/equinix/metal-cli/internal/vrf"
+	"github.com/equinix/metal-cli/test/helper"
+	"github.com/spf13/cobra"
+)
+
+// setupTestProject initializes a test project and returns its ID along with a cleanup function.
+func setupTestProject(t *testing.T, projectName string) (string, func()) {
+	projectId, err := helper.CreateTestProject(projectName)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	teardown := func() {
+		err := helper.CleanTestProject(projectId)
+		if err != nil {
+			t.Error(err)
+		}
+	}
+
+	return projectId, teardown
+}
+
+// setupTestVRF initializes a test VRF within the given project and returns its ID along with a cleanup function.
+func setupTestVRF(t *testing.T, projectId, vrfName string) (string, func()) {
+	vrfId, err := helper.CreateTestVrfs(projectId, vrfName)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	teardown := func() {
+		err := helper.CleanTestVrfs(vrfId)
+		if err != nil {
+			t.Error(err)
+		}
+	}
+
+	return vrfId, teardown
+}
+
+func TestCli_Vrf_Create(t *testing.T) {
+	subCommand := "vrf"
+	consumerToken := ""
+	apiURL := ""
+	Version := "metal"
+	rootClient := root.NewClient(consumerToken, apiURL, Version)
+
+	type fields struct {
+		MainCmd  *cobra.Command
+		Outputer outputPkg.Outputer
+	}
+
+	tests := []struct {
+		name    string
+		fields  fields
+		want    *cobra.Command
+		cmdFunc func(*testing.T, *cobra.Command, *cobra.Command, string)
+	}{
+		{
+			name: "vrf-create-test",
+			fields: fields{
+				MainCmd:  vrf.NewClient(rootClient, outputPkg.Outputer(&outputPkg.Standard{})).NewCommand(),
+				Outputer: outputPkg.Outputer(&outputPkg.Standard{}),
+			},
+			want: &cobra.Command{},
+			cmdFunc: func(t *testing.T, c *cobra.Command, rootCmd *cobra.Command, projectID string) {
+				root := c.Root()
+				RandName, _ := helper.GenerateRandomString(32)
+				projName := "metal-cli-" + RandName + "-vrf-create-test"
+				projectId, cleanupProject := setupTestProject(t, projName)
+				defer cleanupProject()
+
+				if projectId != "" {
+					root.SetArgs([]string{subCommand, "create", "-p", projectId, "-m", "da", "-n", "metal-cli-vrf-create-test", "-a", "3456", "-r", "10.0.1.0/24"})
+					rescueStdout := os.Stdout
+					r, w, _ := os.Pipe()
+					os.Stdout = w
+					if err := root.Execute(); err != nil {
+						t.Error(err)
+					}
+					w.Close()
+					out, _ := io.ReadAll(r)
+					os.Stdout = rescueStdout
+					if !strings.Contains(string(out[:]), "metal-cli-vrf-create-test") {
+						t.Error("expected output should include metal-cli-vrf-create-test, in the out string ")
+					}
+				}
+			},
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			rootCmd := rootClient.NewCommand()
+			rootCmd.AddCommand(tt.fields.MainCmd)
+			tt.cmdFunc(t, tt.fields.MainCmd, rootCmd, "")
+		})
+	}
+}
+
+func TestCli_Vrf_Delete(t *testing.T) {
+	subCommand := "vrf"
+	consumerToken := ""
+	apiURL := ""
+	Version := "metal"
+	rootClient := root.NewClient(consumerToken, apiURL, Version)
+
+	type fields struct {
+		MainCmd  *cobra.Command
+		Outputer outputPkg.Outputer
+	}
+
+	tests := []struct {
+		name    string
+		fields  fields
+		want    *cobra.Command
+		cmdFunc func(*testing.T, *cobra.Command, *cobra.Command, string, string)
+	}{
+		{
+			name: "vrf-delete-test",
+			fields: fields{
+				MainCmd:  vrf.NewClient(rootClient, outputPkg.Outputer(&outputPkg.Standard{})).NewCommand(),
+				Outputer: outputPkg.Outputer(&outputPkg.Standard{}),
+			},
+			want: &cobra.Command{},
+			cmdFunc: func(t *testing.T, c *cobra.Command, rootCmd *cobra.Command, projID, vrfId string) {
+				root := c.Root()
+				RandName, _ := helper.GenerateRandomString(32)
+				projName := "metal-cli-" + RandName + "-vrf-delete-test"
+				projectID, cleanupProject := setupTestProject(t, projName)
+
+				if projectID != "" {
+					vrfId, _ := setupTestVRF(t, projectID, "metal-cli-vrf-delete-test")
+
+					root.SetArgs([]string{subCommand, "delete", "-i", vrfId, "-f"})
+					rescueStdout := os.Stdout
+					r, w, _ := os.Pipe()
+					os.Stdout = w
+					if err := root.Execute(); err != nil {
+						t.Error(err)
+					}
+					w.Close()
+					out, _ := io.ReadAll(r)
+					os.Stdout = rescueStdout
+					if !strings.Contains(string(out[:]), "VRF deletion initiated. Please check 'metal vrf get -i "+vrfId+" ' for status") {
+						t.Error("expected output should include VRF deletion initiated. Please check 'metal vrf get -i " + vrfId + " ' for status, in the out string")
+					}
+				}
+				defer cleanupProject()
+			},
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			rootCmd := rootClient.NewCommand()
+			rootCmd.AddCommand(tt.fields.MainCmd)
+			tt.cmdFunc(t, tt.fields.MainCmd, rootCmd, "", "")
+		})
+	}
+}
+
+func TestCli_Vrf_Get(t *testing.T) {
+	subCommand := "vrf"
+	consumerToken := ""
+	apiURL := ""
+	Version := "metal"
+	rootClient := root.NewClient(consumerToken, apiURL, Version)
+
+	type fields struct {
+		MainCmd  *cobra.Command
+		Outputer outputPkg.Outputer
+	}
+
+	tests := []struct {
+		name    string
+		fields  fields
+		want    *cobra.Command
+		cmdFunc func(*testing.T, *cobra.Command)
+	}{
+		{
+			name: "vrf-get-test",
+			fields: fields{
+				MainCmd:  vrf.NewClient(rootClient, outputPkg.Outputer(&outputPkg.Standard{})).NewCommand(),
+				Outputer: outputPkg.Outputer(&outputPkg.Standard{}),
+			},
+			want: &cobra.Command{},
+			cmdFunc: func(t *testing.T, c *cobra.Command) {
+				root := c.Root()
+				RandName, _ := helper.GenerateRandomString(32)
+				projName := "metal-cli-" + RandName + "-vrf-get-test"
+				projectID, cleanupProject := setupTestProject(t, projName)
+
+				if projectID != "" {
+					vrfId, _ := setupTestVRF(t, projectID, "metal-cli-vrf-get-test")
+					if vrfId != "" {
+						root.SetArgs([]string{subCommand, "get", "-p", projectID})
+						rescueStdout := os.Stdout
+						r, w, _ := os.Pipe()
+						os.Stdout = w
+						if err := root.Execute(); err != nil {
+							t.Error(err)
+						}
+						w.Close()
+						out, _ := io.ReadAll(r)
+						os.Stdout = rescueStdout
+						if !strings.Contains(string(out[:]), vrfId) &&
+							!strings.Contains(string(out[:]), "metal-cli-vrf-get-test") {
+							t.Error("expected output should include " + vrfId + ", in the out string ")
+						}
+					}
+				}
+				defer cleanupProject()
+			},
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			rootCmd := rootClient.NewCommand()
+			rootCmd.AddCommand(tt.fields.MainCmd)
+			tt.cmdFunc(t, tt.fields.MainCmd)
+		})
+	}
+}
diff --git a/test/helper/helper.go b/test/helper/helper.go
index c2e3ea68..c3845076 100644
--- a/test/helper/helper.go
+++ b/test/helper/helper.go
@@ -316,3 +316,32 @@ func SetupProjectAndDevice(t *testing.T, projectId, deviceId *string) *openapicl
 
 	return device
 }
+
+func CreateTestVrfs(projectId, name string) (string, error) {
+	TestApiClient := TestClient()
+
+	var IpRanges []string
+
+	vrfCreateInput := *openapiclient.NewVrfCreateInput("da", name)
+	vrfCreateInput.SetLocalAsn(5678)
+	IpRanges = append(IpRanges, "10.10.1.0/24")
+	vrfCreateInput.SetIpRanges(IpRanges)
+
+	resp, _, err := TestApiClient.VRFsApi.CreateVrf(context.Background(), projectId).VrfCreateInput(vrfCreateInput).Execute()
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "Error when calling `VRFsApi.CreateVrf``: %v\n", err)
+	}
+
+	return resp.GetId(), nil
+}
+
+func CleanTestVrfs(vrfId string) error {
+	TestApiClient := TestClient()
+
+	_, err := TestApiClient.VRFsApi.DeleteVrf(context.Background(), vrfId).Execute()
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "Error when calling `VRFsApi.DeleteVrf``: %v\n", err)
+	}
+
+	return nil
+}